C ++ - Unicode Newline - PullRequest
       19

C ++ - Unicode Newline

0 голосов
/ 02 ноября 2018

У меня все более неприятная проблема: я не могу напечатать символ Юникод (в данном случае некоторые точки Брайля), перевести его на новую строку и ввести больше точек Брайля. Я искал ответы в течение нескольких часов, и я близок к концу.

Я пытался изменить формат символов Юникода, изменить месторасположение, изменить порядок, использовать несколько потоков, один широкий и один нормальный, и использовать бесчисленное множество различных предполагаемых escape-последовательностей Юникода. Это повторяется столько раз, сколько символов в строке. В конце каждой строки должна быть конечная линия в конце.

wout.open((inputstring + "2.txt"), wofstream::binary | wofstream::trunc); //this only happens once


_setmode(_fileno(stdout), _O_U16TEXT);



switch (i) //will be expanded for more cases
{
case (63):
    cout << "\xFF\xFE"; // UTF-16 BOM
    cout << "\x0A\x28";

}



_setmode(_fileno(stdout), _O_TEXT);

Я использую setmode для переключения на U16 и обратно, потому что другие части программы используют текстовый режим. Если это проблема, я могу обойти это. Когда я пытался использовать

    wout << "\n";

в конце каждой строки, он меняет вывод, получая наполовину символы Брайля, как я и ожидал, наполовину бессмысленно, как "* ૾ H ૾ H H ૾ ૾ ૾ H H ૾ H ૾ H H ૾ H". Когда я удаляю какую-либо часть, связанную с печатью символов Брайля, она прекрасно печатает новые строки. Я в недоумении.

1 Ответ

0 голосов
/ 02 ноября 2018

Весь файл состоит из 8-битных или 16-битных символов, как определено спецификацией UTF-16 в первых двух байтах. Вы не можете измениться между ними. Когда вы записываете 8-битный символ новой строки, это отбрасывает обработку остальной части файла, поскольку этот 8-битный символ объединяется со следующим байтом в файле для создания 16-битного символа.

Если мы посмотрим на первые несколько слов вашей опечатанной текстовой строки, у нас будет

0020 0022 ff0a 0afe ff28 0afe ff28 0afe

В двоичном файле (с прямым порядком байтов) они будут упорядочены как

20 00 22 00 0a ff fe 0a 28 ff fe 0a 28 ff fe 0a

и вы можете видеть, как этот однобайтовый символ новой строки сочетается со следующими двумя байтовыми символами для получения неожиданного вывода.

Исправление состоит в том, чтобы всегда записывать 16-битные символы в файл.

...