0

中文单词你好的 unicode 码位分别为 4F60 、 597D 。我从这个工具得到的http://rishida.net/tools/conversion/

下面的控制台应用程序会将你好的十六进制字节序列打印为 60:4F:7D:59 。如您所见,它与每个字符的 unicode 代码点的顺序相反。先60后4F,而不是4F后60。为什么会这样?谁是正确的?工具或控制台应用程序?或两者 ?

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 默认情况下会将字符串输出为 little-endian。您可以改用 UTF-16BE 来强制执行大端顺序。

那个,或者完全相反;)

请注意,这些不是 unicode 代码点,而是 UTF-16BE/LE/UCS-2 字节表示。代码点是一组不同的数字。

编辑:使用UTF-16LEinmb_convert_encoding会给你反向表示。

于 2013-04-12T13:18:00.167 回答