首页 > 解决方案 > C++ - Unicode 换行符

问题描述

我遇到了一个越​​来越令人沮丧的问题,因为我似乎无法打印 unicode 字符(在这种情况下,一些盲文点),将其换行并输入更多盲文点。几个小时以来,我一直在寻找答案,但我已经束手无策了。

我尝试过更改我的 Unicode 字符的格式,更改位置,更改顺序,使用多个 fstream,一个宽一个正常,并使用无数不同的假定 unicode 换行符转义序列。这重复的次数与一行中有多少个字符一样多。在每一行的末尾,它需要在末尾有一个结束线。

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 和从 U16 切换,因为程序的其他部分使用文本模式。如果这是一个问题,我可以解决它。当我尝试使用

    wout << "\n";

在每一行的末尾,它会将输出更改为半盲文字符,就像我期望的那样,半胡言乱语,例如“*૾H૾H૾H૾H૾H૾H૾H૾H૾H”。当我删除与打印盲文字符有关的任何部分时,它可以很好地打印换行符。我不知所措。

标签: c++unicodenewlinebraille

解决方案


整个文件是 8 位或 16 位字符,由前两个字节中的 UTF-16 BOM 确定。你不能在他们之间改变。当您写出一个 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 位字符写入文件。


推荐阅读