Winapi 在文本具有代理项时获取RichEdit中的光标位置

Winapi 在文本具有代理项时获取RichEdit中的光标位置,winapi,unicode,utf-16,richedit,surrogate-pairs,Winapi,Unicode,Utf 16,Richedit,Surrogate Pairs,在Windows上,如果您有一个包含代理项的UTF-16序列,并且将该序列插入RichEdit控件中,RichEdit控件可以很好地处理此问题,并且对于每个代理项对,它将只显示一个字符 我面临的困难是,当我查询选择时,我得到的是UTF-16流中的位置,而不是作为控件中可见字符数的字符位置。我有一个缓慢的解决方案来找出实际位置,但它需要检索文本直到UTF-16中的选择,然后计算实际字符数 我错过什么了吗?还有比这更有效的吗 谢谢 马努 PS:为了查询选择,我使用EM_EXGETSEL消息来填充字符

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

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

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

谢谢

马努


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

这个问题是真实的,而且只会变得更频繁。UTF-16中的单个代码点仅能达到64K个字符,现在有近300K个字符

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

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


本文可能会有所帮助:.

-1这并没有解决Emmanuel关于UTF-16偏移量和RichEdit字符位置之间映射的问题。请显示您遇到问题的代码。代码非常简单,在RichEdit控件上,您希望将光标位置显示为用户的第n个字符位置。不幸的是,Windows返回UTF-16流中的第n个代码单元位置。问题是是否有RICHEDIT的API/消息可以在我不计算的情况下提供这些信息。我仍然希望看到您的代码,包括您的“慢速解决方案”。也许有一种方法可以加速它,如果不能取代它的话。还有,你在哪个操作系统版本上看到这个?我以前从未见过
EM_ux(EX)GETSEL
返回UTF-16编码单元偏移量,而是可见字符偏移量,就像文档中描述的那样。我将尝试复制它。当你不得不自己计算时,有一件事很烦人,那就是你被迫在控件和应用程序之间来回复制文本,使其速度变慢。如果可以通过控件自己的缓冲区来避免这种情况,那么就更容易了。但可能没有其他解决方案。我可以确认
EM_EXGETSEL
确实在检索UTF-16偏移量,而不是视觉字符偏移量。如果您假设它从底层文本(UTF-16)返回所选字符,那么这就有点道理了。