すなばあそび。

テキトウ。とにかく気になった事、モノを取り上げます。

ICEcoderでコーディング環境を作ってみた【5分でできるかな】(そのに)【解決しました】

2013/07/12:追記
ICEcoder作者の Matt Passさんが本エントリ見て修正してくれました。
ので、最新版を引けばUTF-8環境で問題なく使えるはずです。感謝ー。
Twitterすげぇ・・・と思わざるを得ない。


続いちゃう罠。

ファイル開いて、保存して、試して・・・閉じて、開い・・・あれ?
謎のポップアップ。

f:id:fan-tail:20130711232258p:plain

「Your document doesn't appear to be in UTF-8 encoding so has been converted.」
・・・オマエのファイルUTF-8じゃねーから!変換しといたから!そんじゃーね!ってこと?

f:id:fan-tail:20130711232355p:plain

日本語部分が文字化けしとる・・・うぬぬぬぬぬぬ。

しょーがないにゃー。
使うの諦め・・・ない。諦めの悪いσ(^_^です。
文字コードの問題ってめんどくさいですよねー。

取りあえず↑のメッセージ出してるコード確認。grep
で、lib/settings.phpにヒット。コードは↓。

// returns a UTF8 based string with any UFT8 BOM removed
function toUTF8noBOM($string,$message) {
     // Attempt to detect encoding
     if (function_exists('mb_detect_encoding')) {
          $encType = mb_detect_encoding($string);
          // Get rid of any UTF-8 BOM
          $string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);
          // Test for any bad characters
          $teststring = $string;
          $teststringBroken = utf8_decode($teststring);
          $teststringConverted = iconv("UTF-8", "UTF-8//IGNORE", $teststringBroken);
          // If we have a matching length, UTF8 encode it
          if ($encType != "ASCII" && strlen($teststringConverted) == strlen($teststringBroken)) {
               $string = utf8_encode($string);
               if ($message) {
                    echo "<script>top.ICEcoder.message('Your document doesn\'t appear to be in UTF-8 encoding so has been converted.');</script>";
               }
          }
     }
     return $string;
}

BOM切り飛ばしたUTF-8文字列を返す関数ですか・・・ふむー。
PHP全く分かってないσ(^_^になんたる仕打ち・・・。

ちょこちょこマニュアル参照。PHPって便利だねぇ。
mb_detect_encodingが悪さしてEUCとか返してるんじゃ…?
でも検出した文字コード関係なく処理続けてるし…。

とか考えてphp.iniのオプションを弄ってみたり。
こだわりもしがらみもないので、UTF-8で統一してしまえば解消するか?
というわけで/etc/php.iniを以下設定に変えてみる。

mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII
default_charset="UTF-8"
mbstring.input_encoding="UTF-8"
mbstring.internal_encoding="UTF-8"
mbstring.output_encoding="UTF-8"
mbstring.language="japanese"

ついでに/etc/httpd/conf/httpd.confも、
AddDefaultCharset UTF-8
を有効にして/etc/init.d/httpd restart

とりあえずこれでUTF-8ベースで処理されるはず・・・だがまだ化ける。
むしろ"nkf --guess *"でASCIIを返すファイルまでメッセージ出るようになった。ぐああ。

ここでふと。
どうせICEcoder以外で作成したファイル以外は読み込まないんだから、BOMなんかつかないんじゃないか、と。
試しにICEcoder上で適当なファイルを作って(中身は全角文字テキトウ)・・・ついでにBOM付きファイルも作ってみる。
uconv -f utf-8 -t utf-8 --add-signature test.txt > testbom.txt

あ、uconvコマンドなかったんでインストールしました。
yum install icu

んで両方のファイルをfileコマンドで確認。
file *.txt
test.txt: UTF-8 Unicode text
testbom.txt: UTF-8 Unicode (with BOM) text

うん、やっぱりBOMなしで作ってくれてます。切り飛ばしたいくらい憎い存在ですから当たり前か。
てことはこの関数自体が不要って事でいいかな?いいよね?

というわけでこの関数全部コメントアウト(return行だけ残した)したら・・・

f:id:fan-tail:20130711232442p:plain

動いた。
表示もできてる。開き直してもおk。
とりあえずこれでいいや!

ちゃんとデバッグできるようになったら恩返ししたいなぁ・・・と思いつつ。

ではー。