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

C++ 如何计算指定了双向表示的unicode字符串?,c++,unicode,C++,Unicode,伙计们。我有一个相当变态的问题。请原谅我:) 有一个官方算法描述了双向unicode文本应该如何呈现。 我收到一个字符串(来自某些第三方来源),其中包含拉丁/希伯来语字符,以及数字、空格、标点符号等 问题是我收到的字符串在表示形式中已经。也就是说,我收到的字符序列应该从左到右呈现 现在,我的目标是找到表示形式完全相同的unicode字符串。表示-我需要将该字符串传递给另一个实体;然后它将根据官方算法呈现这个字符串,结果应该是相同的 假设: (渲染实体的)默认文本方向是RTL 我不想注入显式覆

伙计们。我有一个相当变态的问题。请原谅我:)

有一个官方算法描述了双向unicode文本应该如何呈现。

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

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

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

假设:

  • (渲染实体的)默认文本方向是RTL
  • 我不想注入显式覆盖文本方向的“特殊unicode字符”(如RLO、RLE等)
  • 我怀疑可能存在几种解决方案。如果是这样,我希望尽可能保留字符串的RTL外观。字符串通常主要由希伯来语单词组成。我想保留这些单词的正确顺序,以及单词中的字符。而其他字符序列可能(也应该)被转置
解决这个问题的一个简单方法是交换整个字符串(这会处理希伯来语单词),然后在其中交换非希伯来语字符序列。然而,这并不总是产生正确的结果,因为实际的表示规则相当复杂

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

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

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

因此,您必须下载USD,然后编写一个类在XML中查找您的角色并返回答案

我是在一个开源C#应用程序中完成的,你可以在这里找到它


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

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

因此,您必须下载USD,然后编写一个类在XML中查找您的角色并返回答案

我是在一个开源C#应用程序中完成的,你可以在这里找到它


请告诉我您的问题是否通过此解决。

纳赛尔,谢谢您的回答。 不幸的是,它不能完全解决我的问题

到目前为止,我能知道每个角色的方向性。我仍然不知道如何计算整个字符串,使其表示形式与我需要的匹配

假设您希望将以下文本从左到右书写,而希伯来语/阿拉伯语字符由大字符表示:

ABC工程123 456 DEF

正确的字符串如下所示: 联邦储备银行456 123英国中央银行 或者: 美联储英语456 123 CBA

或者,如果使用明确的方向覆盖代码,可以这样编写: 美联储英语123 456 CBA

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


不过,我希望在不注入显式覆盖代码的情况下执行此操作。

Nasser,谢谢您的回答。 不幸的是,它不能完全解决我的问题

到目前为止,我能知道每个角色的方向性。我仍然不知道如何计算整个字符串,使其表示形式与我需要的匹配

假设您希望将以下文本从左到右书写,而希伯来语/阿拉伯语字符由大字符表示:

ABC工程123 456 DEF

正确的字符串如下所示: 联邦储备银行456 123英国中央银行 或者: 美联储英语456 123 CBA

或者,如果使用明确的方向覆盖代码,可以这样编写: 美联储英语123 456 CBA

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

但是,我希望在不注入显式重写代码的情况下执行此操作