我是一个解析xml文件的java应用程序,每个文件都包含阿拉伯语(从右到左)和英语(从左到右)数据的组合,这些数据来自后端有很多标签和问题它们之间的空格并没有办法在后端更改它们,当我试图拆分这些数据时,我发现单词的顺序不正确,虽然在删除标签之前订单很好,问题出现了当阿拉伯语和英语单词之间有组合时很多
组合示例
String combinationString = "بمبلغ 2867.51 ريال سعودي رقم العملية LD1131900120";
combinationString.split("/t");
答案 0 :(得分:0)
通过native2ascii
运行该示例代码,我们得到
String combinationString = "\u0628\u0645\u0628\u0644\u063a 2867.51 \u0631\u064a\u0627\u0644 \u0633\u0639\u0648\u062f\u064a \u0631\u0642\u0645 \u0627\u0644\u0639\u0645\u0644\u064a\u0629 LD1131900120";
combinationString.split("/t");
现在我们可以清楚地看到该字符串包含以下(逻辑)顺序的五个制表符分隔字段:
当您尝试显示此逻辑字符序列时会出现混淆 - 明显的单词顺序取决于您显示文本的上下文是否主要是带有某些嵌入式RTL文本的LTR,反之亦然。本质上,双向显示算法将文本分成最大的连续LTR和RTL文本运行,其中诸如标点符号和数字之类的东西根据周围语言的规则处理。在这个例子中你有两个部分,第一部分来自RTL(بمبلغ2867.51ريالسعوديرقمالعملية),第二部分来自LTR(LD1131900120)。
一旦确定了最大片段,显示算法就根据显示环境的主要方向排列这些片段。如果环境主要是LTR,你会得到左边的段1和右边的段2:
بمبلغ2867.51ريالسعوديرقمالعمليةLD1131900120
但如果环境主要是RTL,你会得到右边的第1段和左边的第2段:
بمبلغ2867.51ريالسعوديرقمالعمليةLD1131900120
There are control characters you can add to override this behaviour - 这就是我上面的例子,它是两个相同的文字,但周围的控制字符不同。在示例1中,我通过在U + 202A(左到右嵌入)前面添加前缀并将其加上U + 202C(POP方向格式化)来强制字符串进入LTR上下文,在示例2中,我通过在前缀U前面强制它进入RTL上下文+ 202B(右至左嵌入)和后缀U + 202C。您可以在Java中执行相同的操作
String rtlContext = "\u202b" + someString + "\u202c";