PHPソース中のヘブライ語(その2)

PHPソース中のヘブライ語 - yoyaのメモ
↑これの続き

日本語環境の Visual Studio はテキストを CP932 で扱う為、 ext/calendar/jewish.c 内のヘブライ語(ISO-8859-8)にひっかかりコンパイル出来ない問題があって、今まで iconv で UTF-8 に変換して対応していたのですが、
違う文字列バイナリを入れるとヘブライ語の表示に問題ありそうで、やもやする状況がありました。

対策案は以下の2つ。

locale

(https://twitter.com/yoya/status/300606461652922368)

試しに jewish.c の先頭に

 #pragma setlocale("english")

を入れたけれど Visual Studio2008 + SDK6.1 では同じエラーが出ました。

環境変数とかで変更出来ればよいのですが、情報が見つかりません。
コンパネや VS の設定で言語環境を変えれば対応できそうですが、さすがにそれは人にお勧め出来ませんし。

エスケープ

(https://twitter.com/moriyoshit/status/300614288362586112)

m御大のアドバイスがあり、C言語リテラルエスケープで対処する事にしました。

ISO-8859-8 のヘブライ文字の領域が MSB が立ってて SJIS の1byte目と誤解されてる件の対処なので、8bit スルーさせれば解決する。はず。

<?php
$fp = fopen($argv[1], "rb");
while (feof($fp) === false) {
    $c = fgetc($fp);
    $code = ord($c);
    echo ($code & 0x80)?'\x'.dechex($code):$c;
}
  • 変換実行
yoya@sakura:~$ php clitesc.php /home/yoya/src/php/php-5.3.18/ext/calendar/jewish.c   > jewish.c
  • 結果
char *JewishMonthHebName[14] =
{
    "",
    "\xfa\xf9\xf8\xe9",
    "\xe7\xf9\xe5\xef",
    "\xeb\xf1\xec\xe5",
    "\xe8\xe1\xfa",
    "\xf9\xe1\xe8",
    "\xe0\xe3\xf8",
    "'\xe0\xe3\xf8 \xe1",
    "\xf0\xe9\xf1\xef",
    "\xe0\xe9\xe9\xf8",
    "\xf1\xe9\xe5\xef",
    "\xfa\xee\xe5\xe6",
    "\xe0\xe1",
    "\xe0\xec\xe5\xec"
};

意味的に ' と空白もエスケープするべきだけど、動作的には同じなので今回はコレで。

ちなみに、jewish.c は少なくとも 5.3 から 5.4 までずっと変更がないようです。

yoya@sakura:~$ diff  /home/yoya/src/php/php-5.4.11/ext/calendar/jewish.c /home/y
oya/src/php/php-5.3.18/ext/calendar/jewish.c

これ本家にパッチ送ったら、どんな顔されるかなぁ。w