Порядок следования байтов ICU (BOM) - PullRequest
3 голосов
/ 19 августа 2011

Я использую функции ICU ustdio для записи объекта UnicodeString в файл в диапазоне кодировок, однако, как представляется, он не предшествует спецификации.

Мой код:

void write_file(const char* filename, UnicodeString &str) {

    UFILE* f = u_fopen(filename, "w", NULL, "UTF-16 LE");
    u_file_write(str.getTerminatedBuffer(), str.length() + 1, f);
    u_fclose(f);
}

int _tmain(int argc, _TCHAR* argv[])
{
    UnicodeString str(L"ΠαρθένωνΗ");

    write_file("test.txt", str);

    return 0;
}

Кодировка файла меняется при изменении LE на BE, однако спецификация отсутствует, выходной файл в шестнадцатеричном редакторе:

A0 03 B1 03  C1 03 B8 03  AD 03 BD 03  C9 03 BD 03  97 03 00 00

ПРИМЕЧАНИЕ. Если я задаю кодовую страницу как «UTF-16», существует спецификация, однако после того, как я вручную укажу порядковый номер, она исчезает.

Альтернативно, есть ли способ, которым я мог бы записать UnicodeString в файл с спецификацией?

Ответы [ 2 ]

5 голосов
/ 19 августа 2011

Просто догадываясь, «UTF-16 LE» и «UTF-16 BE» предназначались для использования, когда порядок байтов был задан правильно, и спецификация не понадобится в контексте, где будет использоваться файл.

Вы должны быть в состоянии написать свой символ спецификации '\ufeff' в файл.

2 голосов
/ 20 августа 2011

u_fputc(0x00feff,f);

сделает это.

...