[英]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.