所以,正如你从图像中看到的那样,我已经连接了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。
答案 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);