0

在 Windows 上,如果您有一个包含代理项的 UTF-16 序列,并且将该序列插入到 RichEdit 控件中,则 RichEdit 控件可以很好地处理此问题,并且对于每个代理项对,它只会显示一个字符。

我面临的困难是,当我查询选择时,我得到的是 UTF-16 流中的位置,而不是作为控件中可见字符数的字符位置。我有一个缓慢的解决方案来找出实际位置,但它需要检索文本直到 UTF-16 中的选择,然后自己计算实际字符的数量。

我错过了什么?还有比这更有效的吗?

谢谢,

马努

PS:要查询我使用 EM_EXGETSEL 消息来填充 CHARRANGE 结构的选择。

4

1 回答 1

-1

这个问题是真实存在的,而且只会越来越频繁。UTF-16 中的单个代码点只能达到 64K 字符,而现在已经接近 300K。

您将看到显示为单个字符的一对字符位置(短值)。按照目前的标准,永远只有两个。

在 .Net 代码中,有一些特定的功能可以为您完成这项工作。我不知道 WinApi 中有任何内容。您可以使用使用宏 IS_HIGH_SURROGATE、IS_LOW_SURROGATE 和 IS_SURROGATE_PAIR 进行测试的函数来处理文本。我认为它们没有理由比内置函数慢,但你必须编写它们(除非你可以在某处找到一些源代码)。

这篇文章可能会有所帮助:UTF16(例如wide-winapi函数所使用的)字符是否总是2字节长?.

于 2014-04-09T14:10:31.233 回答