在Windows上,如果您有一个包含代理项的UTF-16序列,并且您在RichEdit控件中插入该序列,则RichEdit控件可以很好地处理这个,并且对于每个代理项对,它只显示一个字符。
我面临的困难是当我查询选择时,我得到UTF-16流中的位置,而不是字符位置作为控件中可见字符的数量。我有一个缓慢的解决方案来找出实际位置,但它需要检索文本直到UTF-16中的选择,然后自己计算实际字符的数量。
我错过了什么吗?还有什么比这更有效的吗?
谢谢,
马努
PS:要查询选择,我正在使用EM_EXGETSEL消息来填充CHARRANGE结构。
答案 0 :(得分:-1)
这个问题很充实,而且只会变得更频繁。 UTF-16中的单个代码点仅达到64K字符,现在有近300K字符。
您将看到的是一对显示为单个字符的字符位置(短值)。根据目前的标准,只会有两个。
在.Net代码中,有一些特殊功能可以帮助您完成这项工作。我在WinApi中没有任何意识。您可以使用使用宏IS_HIGH_SURROGATE,IS_LOW_SURROGATE和IS_SURROGATE_PAIR进行测试的函数来处理文本。我认为它们没有理由比内置函数慢,但你必须编写它们(除非你能在某处找到一些源代码)。
本文可能会对您有所帮助:Are UTF16 (as used by for example wide-winapi functions) characters always 2 byte long?。