在wchar_t数组中索引一个字符

3

这个线程“Size of wchar_t* for surrogate pair”表明,保存wchar_t值所需的内存大小可能会有所不同,因为对于一些字符(代理对),编码需要更多的空间。这引发了以下问题:那么我如何在wchar_t值数组中导航?因为现在我不能仅通过固定的wchar_t大小来增加或减少当前地址。

更正:当我说“如何在wchar_t值数组中导航”时,我的意思是如何在代码点之间导航,这些代码点可能由可变数量的wchar_t值表示。


抱歉:这是C还是C++? - Marco A.
2
@Sam 我认为你需要回去重新阅读那个问题的答案。重点是wchar_twchar_t*的大小不同。在程序中存储wchar_t所需的大小将保持一致。 - Degustaf
也许您误读了您链接的问题;它只是在谈论 sizeof(wchar_t)sizeof(wchar_t *)。它没有讨论用于编码代理对的字符数(OP认为它有,但他错了)。您能澄清一下您的问题吗? - M.M
我认为问题是例如使用2个wchar_t字符的汉字。 因此,ptr ++ptr--在这里不起作用,因为它只移动1个wchar_t。 那么如何导航呢? - wimh
Wimmel做得很好。正是我想表达的意思。 - Sam
4个回答

4

不要使用 wchar_t 来对 Unicode 字符串进行操作。真的,切勿如此。正如你已经发现的那样,wchar_t 对象和 Unicode 代码点之间并不存在一一对应关系。使用 ICU 等库来操作 Unicode 文本。


1
对于一个难以自己解决的情况,提供实用建议是非常有价值的。 - M.M

3

这里存在多个问题,使用ICU等库有助于避免很多问题。如果你尝试计算“字符”,那么UTF-16中代理字符的问题并不是唯一的问题。

如果你只需要遍历一个wchar_t字符串,那么代理值的值可以唯一地定义为前导值(0xd800到0xdbff)后跟一个尾随值(0xdc00到0xdfff)。你可以利用这个知识通过数组向前或向后遍历计算“字符”。这假设你有一组有效的值。

另一个问题是流中的值本身并不是字符。例如U+0301是COMBINING ACUTE ACCENT,它会给前面的值添加重音。无论使用UTF-8、UTF-16还是UTF-32,都可能会遇到这些问题。


0

这个答案澄清了作为一种类型的本质。在问题添加“CORRECTION”之前,似乎这一点被误解了。

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

在语言方面,您可以像导航任何其他类型的数组一样导航数组。

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


你是对的。我已经更正了我的问题,它是有误的。 - Sam
我不确定为什么我在这里一直被踩。我已经尝试澄清我的回答了。我希望能得到任何关于为什么这个答案值得被踩的反馈? - PeterSW
我也不知道为什么有人会对你的回答进行负评。我给了你一个赞成票来抵消那个负评 =)。 - Sam

0

wchar_t 的大小可能在不同的系统中不同,但是它在机器上的运行时或编译时是确定和固定的。

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

基于特定语言环境的 wchar_t 类型具有存储字符的最大大小。因此,字符串代码单元与文本字符之间的映射为一对一,因此,不必担心像其他类型一样迭代宽字符串的字符来读取下一个或上一个字符。(不像 Unicode)

然而,这是 wchar_t 字符串唯一亮点。将它们用作存储任意字符串的通用方式并不容易。因此,您应该使用支持 Unicode 的工具。相关 Q&A 请参阅 此处


1
我认为M M的答案对我很有帮助。是的,我的问题可能并不是很清楚,因为编码的整个概念非常令人困惑。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接