当文本具有代理时,在RichEdit中获取光标位置



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

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

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

谢谢,

Manu

PS:为了查询选择,我使用EM_EXGETSEL消息来填充CHARANGE结构。

这个问题已经足够真实了,而且只会越来越频繁。UTF-16中的单个代码点仅达到64K个字符,目前已接近300K个字符。

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

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

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

相关内容

  • 没有找到相关文章

最新更新