我知道要在C ++中获取unicode字符,我可以这样做:
std::wstring str = L"\u4FF0";
但是,如果我想获得4FF0到5FF0范围内的所有字符怎么办?是否可以动态构建一个unicode角色?我想到的是像这样的伪代码:
for (int i = 20464; i < 24560; i++ { // From 4FF0 to 5FF0
std::wstring str = L"\u" + hexa(i); // build the unicode character
// do something with str
}
我如何在C ++中做到这一点?
答案 0 :(得分:10)
wstring中保存的wchar_t类型是整数类型,因此您可以直接使用它:
for (wchar_t c = 0x4ff0; c <= 0x5ff0; ++c) {
std::wstring str(1, c);
// do something with str
}
小心尝试使用0xffff以上的字符,因为根据平台(例如Windows),它们不适合wchar_t。
例如,如果您想在字符串中看到Emoticon block,则可以创建代理项对:
std::wstring str;
for (int c = 0x1f600; c <= 0x1f64f; ++c) {
if (c <= 0xffff || sizeof(wchar_t) > 2)
str.append(1, (wchar_t)c);
else {
str.append(1, (wchar_t)(0xd800 | ((c - 0x10000) >> 10)));
str.append(1, (wchar_t)(0xdc00 | ((c - 0x10000) & 0x3ff)));
}
}
答案 1 :(得分:4)
你不能将Unicode字符增加,就像它是一个数组一样,有些字符是由多个'char'(UTF-8)和多个'WCHAR(UTF-16)构成的,这是因为变音符号等等。如果你'真的很认真,你应该使用像UniScribe或ICU这样的API。
要阅读的一些资源:
http://en.wikipedia.org/wiki/UTF-16/UCS-2
http://en.wikipedia.org/wiki/Precomposed_character
http://en.wikipedia.org/wiki/Combining_character
http://scripts.sil.org/cms/scripts/page.php?item_id=UnicodeNames#4d2aa980
答案 2 :(得分:2)
怎么样:
for (std::wstring::value_type i(0x4ff0); i <= 0x5ff0; ++i)
{
std::wstring str(1, i);
}
请注意,代码尚未经过测试,因此可能无法按原样编译。
此外,鉴于您正在使用的平台wstring
的字符单元可能是2,4或N字节宽,所以应该有意使用它。