【发布时间】:2011-08-12 08:47:52
【问题描述】:
我有一个代码可以做这样的事情:
char16_t msg[256]={0};
//...
wstring wstr;
for (int i =0;i<len;++i)
{
if((unsigned short)msg[i]!=167)
wstr.push_back((wchar_t) msg[i]);
else
wstr.append(L"_<?>_");
}
如您所见,它使用了一些相当难看的硬编码(我不确定它是否有效,但它适用于我的数据)来确定 wchar_t 转换是否“失败”(即替换字符的值) 来自维基:
替换字符 �(通常是黑色菱形与白色菱形 问号)是在代码点的 Unicode 标准中找到的符号 特价表中的 U+FFFD。它用于指示出现问题时 系统无法将数据流解码为正确的符号。它 当字体不包含字符时最常见,但 当数据无效且不匹配任何字符时也会看到:
所以我有两个问题: 1.有没有合适的方法可以很好地做到这一点? 2. 是否有其他字符(如替换字符)表示转换失败?
编辑:我在 linux 上使用 gcc,所以 wchar_t 是 32 位的,我需要这个演员表工作的原因是因为奇怪的 wstrings 杀死了我的 glog 库。 :) wcout 也死了。 :( :)
【问题讨论】:
-
只要您平台的
wchar_t至少为 16 位宽,转换就不会失败。sizeof(wchar_t) >= sizeof(char16_t)的静态断言可以解决问题,不需要运行时代码。 -
我不认为这就是他所说的“失败”。当然,他做的意思超出了C++的范围。
-
是的,失败是指获取替换字符,而不是感觉文件打开失败中的失败