[英]Print unicode char
我在C ++中尝试了一个非常简单的代码:
#include <iostream>
#include <string>
int main()
{
std::wstring test = L"asdfa-";
test += u'ç';
std::wcout << test;
}
但是结果是:
asdfa-?
无法使用cout或wcout打印'ç',如何正确打印此字符串?
操作系统:Linux。
Ps:我使用wstring
代替string
,因为有时我需要计算字符串的长度,并且此大小必须与屏幕上的大小相同。
附:我需要连接unicode char,它不能放在字符串构造函数上。
首先,这是可行的:
#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
对象并在该域中工作。
一种通用的处理方法是:
输入(使用当前语言环境从多字节转换为宽字节)
您的应用:使用宽字符串
输出或保存到文件(从宽字节转换为多字节)
对于宽字符串操作(如字符数,子字符串等),有wcsXXX类的函数。
如果您在Linux上使用libstdc++
:您在程序开始时忘记了基本调用
std::locale::global(std::locale(""));
这是假设您在Linux上并且您的语言环境支持UTF-8。
如果您使用的是libc++
:忘记使用wstream
。 该库不以有用的方式支持宽字符的I / O(即,像libstdc++
一样转换为UTF-8)。
Windows有一套完全独立的有关Unicode的怪癖。 如果您不必与他们打交道,那么您会很幸运。
使用gcc / libstdc ++和对std :: locale的调用进行演示
使用gcc / libstdc ++进行演示,且未调用std :: locale
在此示例中,不同版本的clang / libc ++的行为有所不同:一些输出?
代替非ASCII字符,有些什么都不输出; 调用std :: locale时有些崩溃,有些则没有。 没有人做正确的事,那就是打印ç
,或者也许我只是没有找到一个可行的方法。 如果您需要与语言环境或wchar_t相关的任何内容,我建议您不要使用libc ++。
我使用转换函数解决了这个问题:
#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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.