0

中国語の你好の Unicode コード ポイントは、それぞれ 4F60 と 597D です。このツールhttp://rishida.net/tools/conversion/から取得したもの

以下のコンソール アプリケーションは、你好の 16 進バイト シーケンスを 60:4F:7D:59 として出力します。ご覧のとおり、各文字の Unicode コード ポイントの逆順になっています。4F の次に 60 ではなく、60 の次に 4F です。誰が正しいですか?ツールまたはコンソール アプリ ? または両方 ?

void printHex (char * buf, char *filename)
{
    FILE *fp;
    fp=fopen(filename, "w");

    if(fp == NULL) return;

    int len2 = sizeof(buf);
    int i;
    char store[10];
    for (i = 0; i < sizeof(buf); i++)
    {
        if (i > 0) fprintf(fp,":");
        //sprintf(store, );

        fprintf(fp,"%02X", buf[i]);
    }
    fprintf(fp,"\n");
    fclose(fp);
}

int main(int argc, char* argv[])
{
    char * str3 = (char*)(L"你好");
    printHex( str3, "C:\\Users\\william\\Desktop\\My Document\\test2.txt");

        return 0;
}

PHP でこの mb_convert_encoding 関数を使用している間。

echo bin2hex(mb_convert_encoding("你好", "UTF-16", "UTF-8")); //result : 4f60 597d
echo bin2hex(mb_convert_encoding("恏絙", "UTF-16", "UTF-8")); //result : 604f 7d59

PHP の結果はオンライン ツールと同じですが、このエンコーディングを使用して php_printer.dll 関数を使用してプリンターで你好を印刷すると、印刷結果は恏絙になり、その逆も同様です。ただし、C++ アプリケーションは正しく印刷できます。PHP の何が問題なのですか? そして解決策は?

4

1 に答える 1

3

どちらも正しいです。違いはエンディアン性にあります。

私の推測では、UTF-16 はデフォルトで文字列をリトルエンディアンとして出力します。代わりに UTF-16BE を使用することで、ビッグエンディアンを適用できます。

それ、またはまったく逆です;)

これらは Unicode コードポイントではなく、UTF-16BE/LE/UCS-2 バイト表現であることに注意してください。コードポイントは異なる数値のセットです。

EDIT : UTF-16LEinmb_convert_encodingを使用すると、逆の表現になります。

于 2013-04-12T13:18:00.167 に答える