打印unicode char

时间:2018-01-12 16:28:01

标签: c++ linux unicode char c++14

我在C ++中尝试了一个非常简单的代码:

#include <iostream>
#include <string>

int main()
{
  std::wstring test = L"asdfa-";
  test += u'ç';
  std::wcout << test;
}

但结果是:

asdfa-?

使用cout或wcout打印'ç'是不可能的,我怎样才能正确打印这个字符串?

操作系统:Linux。

Ps:我使用wstring代替string,因为有时候我需要计算字符串的长度,这个大小必须与屏幕上的大小相同。

Ps:我需要连接unicode char,它不能在字符串构造函数上。

4 个答案:

答案 0 :(得分:4)

首先,这是的工作:

#include <iostream>
#include <string>

int main() {
    std::string test = "asdfa-";
    test += "ç";
    std::cout << test;
}

我在这里使用了常规字符串,让C ++将所有内容保存在UTF-8中。我想你已经知道这会有效,因为你提到你想连接ç而不是把它留在字符串构造函数中。

在C ++中处理charchar16_tchar32_twchar_t从未真正有趣。您必须小心使用LuU前缀。

但是,如果可能的话,如果你处理utf-8字符串,并避免使用字符,你通常可以让事情更好地工作。而且由于大多数游戏机(可能除了旧的Windows机器)都非常了解utf-8,因此这种方法通常效果最好。因此,如果您有宽字符,请查看是否可以将它们转换为常规std::string对象并在该域中工作。

答案 1 :(得分:1)

处理此问题的一般方法是:

  1. 输入(使用当前区域设置从多字节转换为宽)

  2. 您的应用:使用广泛的字符串

  3. 输出或保存到文件(从宽文件转换为多字节)

  4. 对于像字符数,子字符串等那样的宽字符串操作,有wcsXXX类函数。

答案 2 :(得分:1)

如果您在Linux上使用libstdc++:您在程序开头忘记了必要的电话

std::locale::global(std::locale(""));

这假设您使用的是Linux,并且您的语言环境支持UTF-8。

如果您使用libc++:忘记使用wstream。该库不支持有用方式的宽字符I / O(即像libstdc++那样转换为UTF-8)。

Windows有一套完全独立的关于Unicode的怪癖。如果你不必处理它们,你很幸运。

demo with gcc/libstdc++ and a call to std::locale

demo with gcc/libstdc++ and no call to std::locale

不同版本的clang / libc ++在这个例子中表现不同:有些输出?而不是非ascii字符,有些输出什么都没有;有些人在调用std :: locale时崩溃了,有些人不知道。没有做正确的事情,即打印ç,或者我可能还没找到一个有效的。如果您需要与locale或wchar_t相关的任何内容,我建议您不要使用libc ++。

答案 3 :(得分:0)

我使用转换函数解决了这个问题:

#include <iostream>
#include <string>
#include <codecvt>
#include <locale>

std::string wstr2str(const std::wstring& wstr) {
  std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
  return myconv.to_bytes(wstr);
}

int main()
{
  std::wstring test = L"asdfa-";
  test += L'ç';
  std::string str = wstr2str(test)
  std::cout << str;
}