PHP和c++的UTF-8编码单位倒序中文字符

PHP and C++ for UTF-8 code unit in reverse order in Chinese character

本文关键字:单位 倒序 中文 字符 编码 UTF-8 c++ PHP      更新时间:2023-10-16

中文单词"的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有什么问题吗?解决办法呢?

他们都是正确的。不同之处在于尾端顺序。

我的猜测是UTF-16将默认输出小端字符串。您可以通过使用UTF-16BE来强制大端序。

那个,或者正好相反;)

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

EDIT:在mb_convert_encoding中使用UTF-16LE将使您得到相反的表示。