2013-04-12 26 views
0

漢字字符「你好」的Unicode編碼點分別爲4F60,597D。我從這個工具中獲得http://rishida.net/tools/conversion/中文漢字逆序排列的UTF-8編碼單元PHP和C++

下面的控制檯應用程序將打印出您的 的十六進制字節序列爲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?解決方案?

回答

3

它們都是正確的。區別在於排序。

我的猜測是,默認情況下,UTF-16將輸出字符串作爲little-endian。您可以通過使用UTF-16BE來強制執行大順序。

即,或者正好相反;)

注意,這些不是Unicode編碼點,而是UTF-16BE/LE/UCS-2字節表示。 Codepoints是一組不同的數字。

編輯:使用UTF-16LEmb_convert_encoding會給你相反的表示。

+0

OMG,我非常愛你:)花了差不多一個星期,挖掘到PHP C源代碼,然後得到它的作品。謝謝。 mb_convert_encoding(「你好」,「UTF-16LE」,「UTF-8」) – William