从字符的 ASCII 代码点到 wstring
from ascii codepoint of character to wstring
使用下面的代码,我可以获取代码点字符的字符串。 如果代码点>65535 采用错误的字符串。必须怎么做?
wstring giveWStringFromASCII(size_t i)
{
wchar_t character[]= {i,0};
return wstring(character);
}
std::wstring
使用wchar_t
元素。wchar_t
不是可移植的,因为它在 Windows 上使用 2 个字节(UTF-16 编码(,但在其他平台上使用 4 个字节(UTF-32 编码(。
存储在size_t
中的 Unicode 代码点只能在非 Windows 平台上按原样分配给wchar_t
。 在 Windows 上,单个wchar_t
只能处理 BMP (UCS-2( 范围 (U+0000 - U+FFFF( 中的 Unicode 字符。 更高的代码点必须编码为 2 个wchar_t
元素,在 UTF-16 中称为"代理项对"。
您显示的内容只能在非 Windows 平台上按原样工作。 如果您需要支持多个平台,则必须相应地#ifdef
代码,例如:
std::wstring giveWStringFromCodepoint(size_t cp)
{
#ifdef _WIN32
wchar_t ch[2];
if (cp < 0x10000)
{
ch[0] = (wchar_t) cp;
return std::wstring(ch, 1);
}
else
{
cp -= 0x10000;
ch[0] = (wchar_t) ((cp >> 10) + 0xD800);
ch[1] = (wchar_t) ((cp & 0x3FF) + 0xDC00);
return std::wstring(ch, 2);
}
#else
wchar_t ch = (wchar_t) i;
return std::wstring(&ch, 1);
#endif
}
或:
std::wstring giveWStringFromCodepoint(size_t cp)
{
#if (WCHAR_MAX > 0xFFFF)
wchar_t ch = (wchar_t) i;
return std::wstring(&ch, 1);
#else
wchar_t ch[2];
if (cp < 0x10000)
{
ch[0] = (wchar_t) cp;
return std::wstring(ch, 1);
}
else
{
cp -= 0x10000;
ch[0] = (wchar_t) ((cp >> 10) + 0xD800);
ch[1] = (wchar_t) ((cp & 0x3FF) + 0xDC00);
return std::wstring(ch, 2);
}
#endif
}
或:
std::wstring giveWStringFromCodepoint(size_t cp)
{
if (sizeof(wchar_t) > 2)
{
wchar_t ch = (wchar_t) i;
return std::wstring(&ch, 1);
}
else
{
wchar_t ch[2];
if (cp < 0x10000)
{
ch[0] = (wchar_t) cp;
return std::wstring(ch, 1);
}
else
{
cp -= 0x10000;
ch[0] = (wchar_t) ((cp >> 10) + 0xD800);
ch[1] = (wchar_t) ((cp & 0x3FF) + 0xDC00);
return std::wstring(ch, 2);
}
}
}
话虽如此,您最好使用第三方 Unicode 库(如 ICONV 或 ICU(为您处理这种类型的转换。
如果您使用的是 C++11 或更高版本,则它具有可用的std::u16string
和std::u32string
,以避免std::wstring
的可移植性问题。 尽可能考虑使用它们。 或者,如果不使用第三方库,至少考虑在处理 UTF 转换时使用std::wstring_convert
。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- Ctypes wstring通过引用传递
- 从字符的 ASCII 代码点到 wstring
- 在用 C++ 编写的 Python 3 扩展中,如何将 wstring 对象传递给 Python 代码
- C++:为什么在 #include 之前调用 std::wstring::begin() 会导致<vector>此代码中的编译器错误?
- C++将字符串转换为 wstring 并使用最小代码返回