- ベストアンサー
PHPでMariaDBを使ってスペイン語を表示する方法
- PHPとMySQLを使用してスペイン語と英語の対応データベースを作成していますが、特殊文字が正しく表示されません。
- LibreOfficeを使用してスペイン語と英語の文章を作成し、CSVファイルとして保存します。
- MariaDBにデータを移行し、UTF-8をキャラクターセットとして設定することで、正しく表示されることが期待されます。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
解決できてよかったです。 私は気になると自分で試さずにはいられなくなるたちで、Windows10英語版の仮想マシンを用意して同じことをしてみました。 これは私の趣味のようなものなので、ご質問にも質問者さまにもすでに関係なくなっていますので、気になさらないでください。 英語版と言ってもインストール時の地域や言語の選択でなにかしらの違いがあるのかもしれません。 私は英語ができるわけではないのでほぼ初期値で多分英語(US)になっています。 日本語パックやスペイン語パックも入れていないせいか、CPCHしなくても、プロンプトで文字化けしなかったので、コマンドプロンプトの初期文字コードが違うのかも知れません。 PHPの表示(と言っても先の私のコードはHTMLを省略して、タグや文字コードの扱いはブラウザ任せ)も文字化けせず。 うまくいきすぎて質問者さまと同じ現象にならなくて、本当の原因がわからず私の探求心がもやもやに、ふふふ。 環境によってXAMPPで作成されるmy.iniの内容が変わってくるのかも知れません。 MariaDB [okwave] show variables like 'char%'; +--------------------------+--------------------------------+ Variable_name Value +--------------------------+--------------------------------+ character_set_client cp850 character_set_connection cp850 character_set_database utf8 character_set_filesystem binary character_set_results cp850 character_set_server utf8mb4 character_set_system utf8 character_sets_dir Cxamppmysqlsharecharsets +--------------------------+--------------------------------+ my.iniには「cp932」や「cp850」の記述はないのですが、未設定のものはOSの言語かなにかによって随時自動で判定されているのかも知れません。 ついでに「utf8mb4」についてもう少し。 MariaDBからではありませんが、MySQLでは以下のような情報がでているようです。 「MySQL の今後のバージョンでは、utf8 が 4 バイトの utf8 になり、3 バイトの utf8 を指定するときに utf8mb3 を示す必要が生じる可能性があります。」 MariaDBでもおそらく準じるとは思います。 https://dev.mysql.com/doc/refman/5.6/ja/charset-unicode-utf8mb3.html 現状では「utf8mb4」の方が無難なのに、今後「utf8」と言う表記になるとしたら、今からでも「utf8」でやっていた方が後の手間が減るのかなと思ったりしています。 今回のご質問のおかげさまでこのことが知れたのでよかったです。 ありがとうございました。
その他の回答 (5)
- dell_OK
- ベストアンサー率13% (766/5720)
同じバージョンのXAMPP(7.3.11)をインストールして試してみました。 日本語には4バイト文字があるのでutf8mb4の方が無難ですが、スペイン語と英語であればutf8でも大丈夫かなと思って、utf8のデータベースやテーブルで取り込んでみたのですが文字化けしませんでした。 私が試したのは以下のような手順です。 1.CSVファイル sp_en.csv (utf8) 先日は「ñ」しか確認していなかったので、アクセントがついた文字を2つほど追加しました。 ---- cariño,aaa paroxítona,bbb últimamente,ccc ---- 2.データベース okwave (utf8_general_ci) 3.テーブル sp_en (utf8_general_ci) ---- sp text (utf8_general_ci) en text (utf8_general_ci) ---- 4.コマンドプロンプトの起動 ファイル名を指定して実行 cmd 5.コードページ設定 C:\Users\user1>CHCP 65001 6.データベース接続 C:\Users\user1>C:\xampp\mysql\bin\mysql -uroot okwave 7.CSVファイル取り込み MariaDB [okwave]> load data infile "C:\\Users\\user1\\Desktop\\sp_en.csv" into table sp_en fields terminated by ',' lines terminated by '\r\n'; (結果) Query OK, 3 rows affected (0.002 sec) Records: 3 Deleted: 0 Skipped: 0 Warnings: 0 8.SQLで確認 MariaDB [okwave]> select * from sp_en; (結果) +--------------+-----+ | sp | en | +--------------+-----+ | cariño | aaa | | paroxítona | bbb | | últimamente | ccc | +--------------+-----+ 3 rows in set (0.001 sec) 9.phpMyAdminで確認 sp en cariño aaa paroxítona bbb últimamente ccc 10.PHPで表示するプログラム C:\xampp\htdocs\sp_en.php ---- <?php $db = new mysqli('localhost', 'root', '', 'okwave'); $sql = 'select * from sp_en'; $stmt = $db->prepare($sql); $stmt->execute(); $stmt->bind_result($sp, $en); while ($stmt->fetch()) { echo "{$sp}:{$en}<br>\r\n"; } ---- 11.コマンドプロンプトからPHPを実行して確認 C:\Users\user1>C:\xampp\php\php C:\xampp\htdocs\sp_en.php (結果) cariño:aaa<br> paroxítona:bbb<br> últimamente:ccc<br> 12.ブラウザで確認 http://localhost/sp_en.php (結果) cariño:aaa paroxítona:bbb últimamente:ccc これと言って文字コードを意識しなくても大丈夫な感じです。 XAMPPをインストールした初期設定のままでよさそうなので、質問者さまの環境との差異になにかヒントがあるのかも知れません。 カナダにいらっしゃるとのことなので、Windowsは英語版なのでしょうか。
- dell_OK
- ベストアンサー率13% (766/5720)
もうひとつ忘れてました。 テーブルやカラムの照合順序も「utf8mb4_general_ci」など「utf8mb4_」が付いているものに変更してみてください。 とは言ったものの、「ñ」を調べてみたら2バイト文字のようなので、関係なかったら申し訳ないです。
お礼
有難うございます。 色々試してみます。
- dell_OK
- ベストアンサー率13% (766/5720)
書き忘れました。 とりあえずなにもせずに試したらうまくいった感じなので、質問にあった4の「set character_set_~」はまったくやっていません。 SELECTで文字化けしていましたが、5をすると文字化けしなくなりました。 確認したのはプロンプトとphpMyAdminからだけだったので、改めてPHPから表示させてみたところ文字化けしませんでした。
お礼
有難うございます。
- dell_OK
- ベストアンサー率13% (766/5720)
(1)CSVファイルの文字コードはUTF8です。 「utf8mb4」と言うのはMySQLがもともと抱えている「UTF8の4バイト文字が保存できない」問題に対応するためにできた(か、もともとあったけど標準ではあまり使用されていなかった)ようなものだったと思います。 「utf8mb4」を検索されるといろいろな情報がでてくると思いますので一読してみてください。 「utf8mb4」が登場するのはMySQLだけでのことなので、ファイルはUTF8です。 (2)データベースに接続する際と言うのは、コマンドプロンプトでのお話しでしたので以下のように接続しているのかと思っています。 mysql -uxxxx -pxxxx これに先ほどのオプションを追加すると、 mysql -uxxxx -pxxxx "--default-character-set=utf8mb4" 他にもオプションがあればそれも書いてください。 load dataは元のままです。 (3)chcpは質問者さまと同じ「65001」にしています。 今ふと思ったのですが、データベース接続するよりも前にコマンドプロンプトで「chcp 65001」としておく方がいいのかも知れません。 私はXAMPP(7.4.3)の初期値のまま使っているので、質問者さまとはいろいろと違う環境かも知れません。 文字コードを確認してみると以下のようになっていました。 MariaDB [(none)]> show variables like 'char%'; +--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------+ | character_set_client | cp932 | | character_set_connection | cp932 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | cp932 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | C:\xampp\mysql\share\charsets\ | +--------------------------+--------------------------------+ my.ini [client] default-character-set=utf8mb4 [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci
お礼
詳しい情報を有難うございます。 自分はカナダに在住していて、これから会社に行かなくてはなりませんが、帰宅したらご教授頂いたことを試してみたいと思います。 後で結果をお知らせいたします。
- dell_OK
- ベストアンサー率13% (766/5720)
例えば「cariño」のようなものでしょうか。 私はXAMPPのMariaDB(10.4.11)を使っていて、データベースの文字コードは「utf8mb4」なのですが、ファイルとテーブルを作ってload dataしてみると文字化けしませんでした。 他のことでSQLをプロンプトで実行した際にうまくいかなかった時の話しですが、データベースに接続する際のオプションに"--default-character-set=utf8mb4"をつけるとうまくいけたことがあります。 3でデータベースに接続する際にこのオプションを付けて試してみてください。
お礼
早速にご回答いただきまして、有難うございます。しかしながら、自分にはよく理解できませんので、もう少し詳しくお尋ねしてもよろしいでしょうか? (1) まず、オリジナルのCSVファイルをセーブする時には文字セットは何にすればよいのでしょうか? LibreOfficeではUTF8mb4 というのは見つかりませんでしたのでUNICODE(UTF-16) というのを選んでみましたが上手く行きませんでした。 (2) データベースの文字セットにはutfmb4 というのが使えたのでセットしましたが、MariaDBのコマンドラインからもPHPプログラムからも表示は文字化けしたままでした。 また、「3でデータベースに接続する際」とあるのは次のようにload data の文に挿入するという事でしょうか? load data infile "C://xampp/htdocs/spanish2english/sewords19.csv" into table sewords19 character set utf8mb4 fields terminated by ',' lines terminated by '\r\n' このシンタックスは回答者様のご提案の "--default-character-set=utf8mb4" と違っていますが、上の "character set utf8mb4 の部分をこれに変更すればよいのでしょうか? (3)MariaDBのコマンドラインからテーブルの中身を見るのにchcp コマンドで設定するページコードは何でしょうか? 以上お答えいただけると有難いです。
お礼
ご質問への返答が遅れてしまいましたが、PCはカナダで購入したもので、Windowは英語版です。 それに日本語パックを入れて使っています。 回答者様のご説明は順序も合理的なものなので、自分にも非常にわかりやすかったのですが、 同じようにしてもどうしてもPHPプログラムから正しく表示されませんでした。 そこで基本的なことを考えて、MY.ini をいじくってみました。 そして文字コードがcp932になっている部分をutf8にしてみましたら、PHPプログラムでもやっと表示されるようになりました。 これで問題は解決できました。 色々とご指導いただき、本当に有難うございました。
補足
お礼が遅くなって申し訳ありません。 前回までにご回答いただいたことを試しておりましたが変化がありませんでした。 しかし 今まで作ってあったデータベースを一旦捨てて、新しく文字コードとコレーションを UTF8 に指定して作り直し、 load data infile コマンドで移植したら、プロンプト画面ではアクセントのついた母音やNの上のティルダなどが見れるようになりました。 それでもまだPHPのプログラムでは?になったままです。 今回はまた、自分と同じ環境で試したという詳しい情報を頂き、本当に有難うございます。 ご提案の情報から、PHPプログラムでの表示をどうすれば出来るのかを研究したいと思います。 結果が出ましたらお知らせいたします。