如何计算指定双向表示的unicode字符串?

时间:2010-04-29 07:56:40

标签: c++ unicode

研究员。我有一个相当变态的问题。请原谅我:))

有一个官方算法描述了应该如何呈现双向unicode文本。 http://www.unicode.org/reports/tr9/tr9-15.html

我收到一个字符串(来自某些第三方来源),其中包含拉丁/希伯来字符,以及数字,空格,标点符号等。

问题是我收到的字符串在表示形式中已经。即 - 我收到的字符序列应该从左到右呈现。

现在,我的目标是找到表示完全相同的unicode字符串。意思是 - 我需要将该字符串传递给另一个实体;然后它会根据官方算法渲染这个字符串,结果应该是相同的。

假设如下:

  • (渲染实体的)默认文本方向是RTL。
  • 我不想注入明确覆盖文本方向的“特殊unicode字符”(例如RLO,RLE等)。
  • 我怀疑可能存在多种解决方案。如果是这样 - 我想尽可能保留字符串的RTL外观。该字符串通常由希伯来语单词组成。我想保留这些单词的正确顺序,以及这些单词中的字符。而其他字符序列可能(并且应该)被转置。

解决这个问题的一种天真的方法就是交换整个字符串(这会处理希伯来语单词),然后在其中交换非希伯来字符的序列。然而,这并不总能产生正确的结果,因为实际的表示规则相当复杂。

到目前为止,我看到的唯一综合算法是强力检查。该字符串可以分为同类字符序列。那些序列可以以随机顺序连接,加上它们中的任何一个都可以颠倒。我可以检查所有这些组合以获得正确的结果。 此外,该技术可以进行优化。例如,希伯来词的顺序是已知的,因此我们只需检查其“连接”序列的不同组合。

有更好的想法吗?如果你有一个想法,不一定是整个解决方案 - 没关系。我会感激任何想法。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

如果要检查字符是否为双向字符,则必须使用Unicode.org提供的UCD(Unicode字符数据库),并包含大量有关字符的信息。在其中一个DB属性中,您可以找到角色的双向性

所以你必须下载USD,然后编写一个类来在XML中查找你的角色并返回答案

我在开源C#应用程序中执行了此操作,您可以在此处http://Unicode.Codeplex.com

请让我知道您的问题是否得到解决。

答案 1 :(得分:0)

纳赛尔,谢谢你的回答。 不幸的是,它并没有完全解决我的问题。

到目前为止,每个角色我都能知道它的方向性。我仍然看不出如何计算整个字符串,以使其表示符合我的需要。

想象一下,你想要从左到右书写下面的文字,而希伯来语/阿拉伯语字符用BIG表示:

ABC eng 123 456 DEF

正确的字符串将是这样的: FED 456 123 eng CBA 或者: FED eng 456 123 CBA

或者,如果使用显式方向覆盖代码,则可以这样写: FED eng 123 456 CBA

目前,我通过将明确的方向性覆盖代码注入字符串来解决了这个问题。因此,我隔离了希伯来语/阿拉伯语单词的序列,并且对于所有加入的LTR /弱/中性字符,我明确地覆盖了LTR的方向。

但是我想在不注入显式覆盖码的情况下这样做。