我正在开发一个打印一些Unicode文本的C ++控制台程序。在Linux上它只是起作用,但在Windows上它表现得很奇怪:只要Unicode字符不在std::string
的开头,它们就会正确显示。如果是,程序就会停止。
这是减少:
#include <iostream>
#include <string>
using std::cout;
int main() {
std::string letters = "àèéìòùäöüß";
std::string is_nice = "è bello"; // In Italian this means "is nice"
cout << "Concatenating the strings using '+':\n";
cout << "Unicode " + letters << "\n";
cout << "Unicode " + is_nice << "\n";
cout << "\n";
cout << "Using 'cout' and 'operator<<' to print the strings:\n";
cout << "Unicode " << letters << "\n";
cout << "Unicode " << is_nice << "\n";
}
源文件编码为UTF-8。在Linux上我用
编译它(使用g ++ 5.4.0)g++ -std=c++14 -Wall -Wextra Unicode.cpp -o Unicode
和Windows(使用MinGW.org GCC-6.3.0-1)和
g++ -std=c++14 -Wall -Wextra Unicode.cpp -o Unicode.exe
如果我编译并从Linux运行它(在这种情况下我使用的是Windows Subsystem for Linux,在Windows 10上运行的Ubuntu版本),没有问题,一切正常。
如果我编译它并从Windows(cmd和PowerShell)运行它,它取决于。起初该程序正在打印垃圾。然后我按照another answer中给出的说明,即我使用命令chcp 65001
将我的代码页设置为Unicode,使用UTF-8编码,我已将字体更改为Lucida Console。现在,当我cout
一个以常规ASCII字符开头的字符串(如前两个字符串)时,一切正常,但是如果有一个字符串以à
或è
这样的字符开头(就像最后2个一样),程序停止了。作为参考,这是Linux上的输出:
使用'+'连接字符串:
Unicodeàèéìòùäößß
Unicodeèbello使用'cout'和'operator&lt;&lt;'打印字符串:
Unicodeàèéìòùäößß
Unicodeèbello
这就是我在Windows上获得的:
使用'+'连接字符串:
Unicodeàèéìòùäößß
Unicodeèbello使用'cout'和'operator&lt;&lt;'打印字符串:
Unicode的
它结束了。显然,如果Unicode字符位于字符串的中间,则会正确处理它们,但如果Unicode字符位于开头,程序就会停止。作为一种解决方法,我可以删除“Unicode”之后的空格并将其放在这两个字符串的开头,并且它可以工作。但我对此并不满意。
为什么Unicode字符位于哪个位置?我该如何解决?