Java String错误的顺序连接不同的语言

时间:2015-10-19 15:25:09

标签: java string unicode concatenation

Screen Shoot of strange java String behavior

所以,正如你从图像中看到的那样,我已经连接了a,c和b。我得到了我预期的结果。 但是在第二张println中,当我连接a,e和b时,我最终连接起来了,而不是我期待的那样。 我想知道,这种行为的原因和这种行为的解决方案。 提前谢谢。

import java.util.*;
public class prob 
{
    public static void main(String... args)
    {
        String a="الف",b="1/2",c="ب",e="B";

        System.out.println(a+" : "+c+" : "+b);
        System.out.println(a+" : "+e+" : "+b);
    }
}

编辑(解释为什么我的问题不重复): 我的问题是将L2R语言转换为R2L。

2 个答案:

答案 0 :(得分:12)

这是因为第一个字符是R2L(从亚洲语言开始的从右到左的方向),所以下一个字符就在开头(正确的方向):

第一个字符:

الف 
// actual orientation ←

第二个字符添加在L

// add ←
B : الف 
// actual orientation →

在此之后,B是欧洲常见的L2R,所以下一个char(1/2)以正确的方向添加在B之后:

// → add in this direction
B : 1/2 : الف 
// actual orientation → (still)

您可以通过复制粘贴字符轻松测试它并手动编写另一个,您将看到方向如何根据您插入的字符进行更改。

<强>更新

  

我对这个问题的解决方案是什么,因为我做这个例子只是为了说明我在制作一些大报告时面临的问题,有时数据混合,它是L2R字符串,有时是R2L。我想严格按照这种格式制作一个字符串。(

来自this answer

  
      
  • 从左到右嵌入(U + 202A)
  •   
  • 从右向左嵌入(U + 202B)
  •   
  • 流行方向格式(U + 202C)
  •   
     

所以在java中,要用像英语这样的LTR语言嵌入像阿拉伯语这样的RTL语言,你会这样做

myEnglishString + "\u202B" + myArabicString + "\u202C" + moreEnglish
  

并做反向

myArabicString + "\u202A" + myEnglishString + "\u202C" + moreArabic
  

参见(对于源材料)

     

ADD ON 2:

char l2R = '\u202A';
System.out.println(l2R + a + " : " + e +" : "+b);

<强>输出:

‪الف : B : 1/2

答案 1 :(得分:3)

正如在answer中已经说过的那样,原因是某些字符串具有从右到左的方向。

您可以使用\u200e控件character手动将方向设置为从右到左方向的letf-to-right,如:

String a="\u200eالف",b="1/2",c="\u200eب",e="B";

System.out.println(a+" : "+c+" : "+b);
System.out.println(a+" : "+e+" : "+b);