簡體   English   中英

C ++-Unicode換行符

[英]C++ - Unicode Newline

我遇到了一個越​​來越令人沮喪的問題,因為我似乎無法打印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,因為該程序的其他部分使用文本模式。 如果有問題,我可以解決。 當我嘗試使用

    wout << "\n";

在每行的末尾,它將輸出更改為半盲文字符,如我所期望的那樣,半亂碼,例如“ *૾H૾H૾H૾H૾H૾H૾H૾H૾H૾H૾H૾H”。 當我刪除任何與打印盲文字符有關的部分時,它會打印換行符。 我很茫然。

整個文件是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位字符寫入文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM