用于UTF-8代码单元的PHP和C ++中文字符的逆序

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

下面的控制台应用程序将打印出60:4F:7D:59的hex字节序列。 正如您所看到的,它与每个字符的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  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有什么问题? 和解决方案?

他们都是正确的。 区别在于endian-ness。

我的猜测是UTF-16默认输出字符串为little-endian。 您可以使用UTF-16BE来强制执行big-endianness。

那,或者完全相反;)

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

编辑 :在mb_convert_encoding使用UTF-16LE将为您提供反向表示。