PHP и C ++ для кодовой единицы UTF-8 в обратном порядке на китайском иероглифе

Кодовая точка 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? И решение?

0

Решение

Они оба правы. Разница в порядке байтов.

Я предполагаю, что UTF-16 будет выводить строку с прямым порядком байтов по умолчанию. Вы можете использовать big-endianness, используя взамен UTF-16BE.

Это, или точное обратное;)

Обратите внимание, что это не кодовые точки Unicode, а представление байтов UTF-16BE / LE / UCS-2. Кодовые точки — это другой набор чисел.

РЕДАКТИРОВАТЬ: С помощью UTF-16LE в mb_convert_encoding даст вам обратное представление.

3

Другие решения

Других решений пока нет …