自宅サーバー・Apche・PHP・PDO・SQLite環境での文字コードは結局UTF-8

  • Shift-Jisでがんばった。きっとできると信じてやってきた。ずっとマイクロソフトのお世話になってきた。それでなんとかやってきたんだから、今度の壁も乗り越えられる。大丈夫だと思っていた。多分、乗り越える方法はどこかにあるのだろう。しかし、それを見つける根気がない。
  • Amigoデータベースでカクテルのデータベースをつくり、SQLiteに移植してきた。いろいろと困難はあったがなんとかできた。そう思っていた。99%までできた。しかし、最後の最後でバグが取れずに2日悩んだ。こういうことだ→
  • キーワード検索で例えば「ライム」で検索をかければ「ライムライト」と「ジンライム」が検索されなければならないのに「ライムライト」しか出てこない。「イム」で検索すれば、両方出てくるはずなのにどちらも出てこない。しかし、「ジンライム」で検索すれば「ジンライム」はちゃんと出てくる。???POSTやGETでWHRE句の中身をページに受け渡しているが、特に文字化けはない。見た目は何も文字化けしていないのに検索結果が一部変になる。何をどういじくっても直らない。
  • ご飯を食べていても、風呂に入っていても、トイレの最中にも頭の中にそのバグが黒雲のごとく重苦しく広がった。そのうち夢にまで出てきて、うなされて起きてしまった。これは末期的だと思って、根本的な見直しをすることにした。
  • これまでShift-Jisのお世話になった。しかし、さよならだ。UTF-8にしよう。それしかない。ためしにやってみたら、完璧にできた。めんどくさいと思ってやらなかったが、UTF-8にしないと結局余計にめんどくさい。時代の流れには逆らえないというか、マイクロソフトもだんだん錆びてきたんじゃないかと思えてくる。
  • 参考になったページ

PHPの文字化けを本気で解決する ぎじゅっやさんhttp://hain.jp/index.php/tech-j/2007/02/13/p125

  • 難しく考えると迷宮に迷い込む。このページの設定にしておけば、基本的に文字化けはない。
output_buffering = Off
; default_charset = EUC-JP 
mbstring.language = Japanese
mbstring.encoding_translation = off
mbstring.http_input = pass 
mbstring.http_output = pass 
mbstring.internal_encoding = EUC-JP 
mbstring.substitute_character = none 
mbstring.detect_order = SJIS,EUC-JP,JIS,UTF-8,ASCII
  • 実際、PHP.iniではほとんど何もやらない方がいいということ。個々のページやプログラムで設定しろって事。そのことがよくわかるように書いてある。文字化けでググれば、ああしろこうしろといろいろ書いてあるが、結局何もせずに個々のページでUTF-8にすれば間違いないって事よ。実際そのとおりだ。今まで頭の中に立ち込めていた黒雲がうそのように引いていった。こんなことなら最初からUTF-8でやればよかった。
  • ど素人っていうのは恐いもの知らずで、オレ、ひどいことしてた。getのクエリー文字を日本語で普通に書いてた。でも、できたんだ。
  • getのクエリー文字列には日本語や空白を使ってはいけないらしいが、おれ、できてるよ。エンコードも何もせずに。

ichirann.php?where=recipi like '%アイスコーヒー%'

てなぐあいで。

  • しかし、それはやはりまずいだろうということで、urlencode()を使うことにしたが、
$qstr = "?where=recipi like '%アイスコーヒー%'";
urlencode($qstr);

でクエリ渡すと、西ヨーロッパ言語になって文字化け。はあ?おれ、全部UTF-8にしたよ。何?

これで足掛け2日悩む。

どうもurlencode()は最初の文字が"?"だといかんみたいで

$qstr = "where=recipi like '%アイスコーヒー%'";

のように?以外の文字から始まるようにすればすんなりいけるようだ。かんべんしてよ。

こういうくだらんことに早く気付けないのが素人。

最終更新:2011年10月14日 15:24