我在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,它不能在字符串构造函数上。
答案 0 :(得分:4)
首先,这是做的工作:
#include <iostream>
#include <string>
int main() {
std::string test = "asdfa-";
test += "ç";
std::cout << test;
}
我在这里使用了常规字符串,让C ++将所有内容保存在UTF-8中。我想你已经知道这会有效,因为你提到你想连接ç而不是把它留在字符串构造函数中。
在C ++中处理char
,char16_t
,char32_t
和wchar_t
从未真正有趣。您必须小心使用L
,u
和U
前缀。
但是,如果可能的话,如果你处理utf-8字符串,并避免使用字符,你通常可以让事情更好地工作。而且由于大多数游戏机(可能除了旧的Windows机器)都非常了解utf-8,因此这种方法通常效果最好。因此,如果您有宽字符,请查看是否可以将它们转换为常规std::string
对象并在该域中工作。
答案 1 :(得分:1)
处理此问题的一般方法是:
输入(使用当前区域设置从多字节转换为宽)
您的应用:使用广泛的字符串
输出或保存到文件(从宽文件转换为多字节)
对于像字符数,子字符串等那样的宽字符串操作,有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;
}