这个线程“Size of wchar_t* for surrogate pair”表明,保存wchar_t值所需的内存大小可能会有所不同,因为对于一些字符(代理对),编码需要更多的空间。这引发了以下问题:那么我如何在wchar_t值数组中导航?因为现在我不能仅通过固定的wchar_t大小来增加或减少当前地址。
更正:当我说“如何在wchar_t值数组中导航”时,我的意思是如何在代码点之间导航,这些代码点可能由可变数量的wchar_t值表示。
不要使用 wchar_t
来对 Unicode 字符串进行操作。真的,切勿如此。正如你已经发现的那样,wchar_t
对象和 Unicode 代码点之间并不存在一一对应关系。使用 ICU 等库来操作 Unicode 文本。
这里存在多个问题,使用ICU等库有助于避免很多问题。如果你尝试计算“字符”,那么UTF-16中代理字符的问题并不是唯一的问题。
如果你只需要遍历一个wchar_t字符串,那么代理值的值可以唯一地定义为前导值(0xd800到0xdbff)后跟一个尾随值(0xdc00到0xdfff)。你可以利用这个知识通过数组向前或向后遍历计算“字符”。这假设你有一组有效的值。
另一个问题是流中的值本身并不是字符。例如U+0301是COMBINING ACUTE ACCENT,它会给前面的值添加重音。无论使用UTF-8、UTF-16还是UTF-32,都可能会遇到这些问题。
这个答案澄清了作为一种类型的本质。在问题添加“CORRECTION”之前,似乎这一点被误解了。
与任何具体类型一样,sizeof(wchar_t)
对于特定系统是恒定的,sizeof(wchar_t *)
也是如此。
在语言方面,您可以像导航任何其他类型的数组一样导航数组。
然而,使用用不同数量的编码的文本字符是另一个更复杂的问题。其他答案在某种程度上已经解决了这个问题。
wchar_t
的大小可能在不同的系统中不同,但是它在机器上的运行时或编译时是确定和固定的。
您可以通过操作符 sizeof
来检索其大小,也可以像其他类型一样迭代它。
基于特定语言环境的 wchar_t
类型具有存储字符的最大大小。因此,字符串代码单元与文本字符之间的映射为一对一,因此,不必担心像其他类型一样迭代宽字符串的字符来读取下一个或上一个字符。(不像 Unicode)
然而,这是 wchar_t
字符串唯一亮点。将它们用作存储任意字符串的通用方式并不容易。因此,您应该使用支持 Unicode 的工具。相关 Q&A 请参阅 此处。
wchar_t
和wchar_t*
的大小不同。在程序中存储wchar_t
所需的大小将保持一致。 - Degustafsizeof(wchar_t)
和sizeof(wchar_t *)
。它没有讨论用于编码代理对的字符数(OP认为它有,但他错了)。您能澄清一下您的问题吗? - M.Mptr ++
和ptr--
在这里不起作用,因为它只移动1个wchar_t。 那么如何导航呢? - wimh