PHPとUnicode:WindowsとLinuxの間の奇妙さ
質問
IBMを見てください 作業PHPプログラマー用のUnicode, 、特にリスト3と4。
ubuntu lucidでは、IBMと同じコードから同じ出力を取得します。
Здравсствуйте
Array
(
[1] => 65279
[2] => 1047
[3] => 1076
[4] => 1088
[5] => 1072
[6] => 1074
[7] => 1089
[8] => 1089
[9] => 1090
[10] => 1074
[11] => 1091
[12] => 1081
[13] => 1090
[14] => 1077
)
Здравсствуйте
ただし、Windowsでは、まったく異なる応答が得られます。
ðùð┤ÐÇð░ð▓ÐüÐüÐéð▓Ðâð╣ÐéðÁ
Array
(
[1] => -131072
[2] => 386138112
[3] => 872677376
[4] => 1074003968
[5] => 805568512
[6] => 839122944
[7] => 1090781184
[8] => 1090781184
[9] => 1107558400
[10] => 839122944
[11] => 1124335616
[12] => 956563456
[13] => 1107558400
[14] => 889454592
)
ðùð┤ÐÇð░ð▓ÐüÐüÐéð▓Ðâð╣ÐéðÁ
ロシアのキャラクター(UTF-32にある)がCMD.exeシェル(WindowsのUTF-16ではなくUTF-32にあるため)でレンダリングしないという事実は別として、なぜキャラクターの値が異なるのかとても大幅に?
解決
function utf8_to_unicode_code($utf8_string)
{
$expanded = iconv("UTF-8", "UTF-32", $utf8_string);
return unpack("L*", $expanded);
}
これは2つのことを行います。
「UTF-32」を使用します。これにより、文字列の開始時に不要なBOMがドロップされるため、65279(0xfeff bom)が得られます。あなたはその場所の周りにぶら下がって迷惑なボムがトラブルを引き起こしたくない。
マシン固有のバイトエンディアンネス(資本)を使用します
L
) どれのiconv
同意しないかもしれません。正直に言うと、私は持っていません 期待される Windowsボックスで衝突するのは(I386はOSに関係なく小さなエンディアンです)が、明らかに、あなたが持っている値はすべて逆バイトの順序から生じるものであるためです。
両方のバイトの順序を明示的に述べ、BOMを避ける方が良いでしょう。使用する UCS-4LE
エンコーディングとして、そして開梱します V*
. 。同じことが当てはまります unicode_code_to_utf8
.
また、リスト6を無視してください。省略記号のキャラクターは、fi-ligatureなどのようなもので、最新のユニコードとオープンタイプの世界では使用しない「互換性のあるキャラクター」です。コンテキストの代替案を提供するのはフォント次第です fi
また ...
必要に応じて、テキストをマングルすることを要求する代わりに。