如何在c++中迭代unicode字符
How to iterate over unicode characters in C++?
我知道要在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++中做到这一点?
保存在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块,您可以创建代理对:
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)));
}
}
你不能在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 # 4 d2aa980 http://en.wikipedia.org/wiki/Unicode_equivalence http://msdn.microsoft.com/en-us/library/dd374126.aspx怎么样:
for (std::wstring::value_type i(0x4ff0); i <= 0x5ff0; ++i)
{
std::wstring str(1, i);
}
请注意,代码没有经过测试,所以它可能不能按原样编译。
另外,考虑到您正在使用的平台,wstring
的字符单元可能是2、4或N字节宽-因此要注意如何使用它。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 迭代时从向量和内存中删除对象
- 如何在c++迭代器类型中包装std::chrono
- 带过滤器的现代迭代c++集合
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- C++矢量迭代
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 擦除while循环中迭代的元素
- 实现一个在集合上迭代的模板函数
- 对于set上的循环-获取next元素迭代器
- 在向量内的向量上迭代
- 为什么output_editor Concept不需要output_e迭代器标记
- TSP递归解的迭代形式
- 将std::string中的迭代字符与unicode C++进行比较
- 在 c++ 中迭代打印完整的 Unicode 字符集
- 逐个字符迭代Unicode码点
- 如何在c++中迭代unicode字符