簡體   English   中英

c ++,cout和UTF-8

[英]c++, cout and UTF-8

希望一個簡單的問題:當處理以多字節UTF-8字符結尾的字符串時, cout似乎死了,我做錯了什么? 這是在Win7 x64上使用GCC(Mingw)。

**編輯抱歉,如果我不夠清楚,我不關心丟失的字形或如何解釋字節,只是在調用cout << s4 (缺少BAR)后它們沒有顯示。 在第一次顯示之后的任何進一步的cout沒有任何文字!

#include <cstdio>
#include <iostream>
#include <string>

int main() {
    std::string s1("abc");
    std::string s2("…");  // … = 0xE2 80 A6
    std::string s3("…abc");
    std::string s4("abc…");

    //In C
    fwrite(s1.c_str(), s1.size(), 1, stdout);
    printf(" FOO ");
    fwrite(s2.c_str(), s2.size(), 1, stdout);
    printf(" BAR ");
    fwrite(s3.c_str(), s3.size(), 1, stdout);
    printf(" FOO ");
    fwrite(s4.c_str(), s4.size(), 1, stdout);
    printf(" BAR\n\n"); 

    //C++
    std::cout << s1 << " FOO " << s2 << " BAR " << s3 << " FOO " << s4 << " BAR ";
}

// results:

// abc FOO ��� BAR ���abc FOO abc… BAR

// abc FOO ��� BAR ���abc FOO abc…

如果您希望程序使用當前的語言環境,請將setlocale(LC_ALL, "")作為程序中的第一項內容。 否則,程序的語言環境是C ,它對非ASCII字符的作用是我們僅僅是人類所不知道的。

這真的不足為奇。 除非您的終端設置為UTF-8編碼,否則它如何知道s2不應該是“(帶有抑揚符的拉丁文小寫字母a)(歐元符號)(管道)”,假設您的終端設置為ISO- 8859-1根據http://www.ascii-code.com/

順便說一句,cout並沒有“死”,因為它顯然繼續在測試字符串后產生輸出。

默認情況下,Windows控制台不處理非本地代碼頁字符。

您需要確保在控制台窗口中設置了支持Unicode的字體,並且通過調用chcp將代碼頁設置為UTF-8。 盡管如此,這並不能保證成功。 請注意,如果控制台無法顯示花哨的字符,那么`wcout'什么都不會改變,因為它的字體是拙劣的。

在所有現代Linux發行版中,控制台都設置為UTF-8,這應該是開箱即用的。

正如其他人所指出的那樣, std::cout與此無關,至少在"C"語言環境中是默認的(默認)。 另一方面,您的控制台窗口必須設置為顯示UTF-8:代碼頁65001.在執行程序之前嘗試調用chcp 65001 (這在過去對我有用。)

暫無
暫無

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

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