为什么我不能在Windows上以Unicode字符开头的字符串?

时间:2018-02-06 09:57:29

标签: c++ windows unicode stdstring

我正在开发一个打印一些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字符位于哪个位置?我该如何解决?

0 个答案:

没有答案