研究员。我有一个相当变态的问题。请原谅我:))
有一个官方算法描述了应该如何呈现双向unicode文本。 http://www.unicode.org/reports/tr9/tr9-15.html
我收到一个字符串(来自某些第三方来源),其中包含拉丁/希伯来字符,以及数字,空格,标点符号等。
问题是我收到的字符串在表示形式中已经。即 - 我收到的字符序列应该从左到右呈现。
现在,我的目标是找到表示完全相同的unicode字符串。意思是 - 我需要将该字符串传递给另一个实体;然后它会根据官方算法渲染这个字符串,结果应该是相同的。
假设如下:
解决这个问题的一种天真的方法就是交换整个字符串(这会处理希伯来语单词),然后在其中交换非希伯来字符的序列。然而,这并不总能产生正确的结果,因为实际的表示规则相当复杂。
到目前为止,我看到的唯一综合算法是强力检查。该字符串可以分为同类字符序列。那些序列可以以随机顺序连接,加上它们中的任何一个都可以颠倒。我可以检查所有这些组合以获得正确的结果。 此外,该技术可以进行优化。例如,希伯来词的顺序是已知的,因此我们只需检查其“连接”序列的不同组合。
有更好的想法吗?如果你有一个想法,不一定是整个解决方案 - 没关系。我会感激任何想法。 提前谢谢。
答案 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的方向。
但是我想在不注入显式覆盖码的情况下这样做。