索引wchar_t数组中的字符

时间:2014-08-19 20:05:24

标签: c++ c arrays unicode wchar-t

主题" Size of wchar_t* for surrogate pair"显示,保存wchar_t值所需的内存大小可能不同,因为它可能需要更多空间来编码某些字符(代理项对)。这引出了以下问题:我如何导航wchar_t值数组?因为我现在不能仅通过固定大小的wchar_t来递增或递减当前地址。

更正:通过"然后我如何导航wchar_t值数组"我的意思是你如何在可能由可变数量的wchar_t值表示的代码点之间导航。

4 个答案:

答案 0 :(得分:4)

不要使用wchar_t对Unicode字符串执行操作。说真的,不要。正如您已经观察到的那样,wchar_t个对象与Unicode代码点之间没有一对一的对应关系。使用ICU等库来操作Unicode文本。

答案 1 :(得分:3)

这里存在多个问题,使用ICU等库可以帮助您避免很多问题。如果你试图计算"字符",UTF-16中代理字符的问题不是唯一的问题。

如果您只需要遍历wchar_t字符串,则代理值的值将唯一地定义为前导值(0xd800到0xdbff),后跟一个尾随值(0xdc00到0xdfff)。您可以使用此知识向前或向后遍历计算"字符"的数组。这假设您有一组有效的值。

另一个问题是流中的值本身并不是一个字符。例如,U + 0301是COMBINING ACUTE ACCENT,并为前一个值添加重音。无论是使用UTF-8,UTF-16还是UTF-32,这都是一个问题。

答案 2 :(得分:0)

这个答案澄清了wchar_t作为一种类型的本质。在这个问题得到纠正之前,这似乎被误解了?#34; CORRECTION"加入。

与任何具体类型一样,sizeof(wchar_t)对于特定系统是sizeof(wchar_t *)的常量。

在语言术语中,您可以导航wchar_t数组,就像导航任何其他类型的数组一样。

然而,处理编码了不同数量wchar_t s的文本字符是另一个更复杂的问题。其他答案在某种程度上解决了这个问题。

答案 3 :(得分:0)

wchar_t的大小在各种不同的系统中可能会有所不同,它在运行时或计算机上的编译时是确定的和固定的。

您可以通过运算符sizeof检索其大小,也可以像其他类型一样迭代它。

基于特定区域设置的类型wchar_t具有存储角色的最大大小。因此,字符串的代码单元与文本字符之间的映射是一对一,因此不必担心迭代宽字符串的字符与其他类型相同,可以读取下一个或上一个字符。 (与Unicode不同)

然而,这是wchar_t字符串中唯一明亮的部分。使用它们作为存储任意字符串的一般方法并非易事。所以,你应该使用Unicode识别的东西。相关的Q& A是here