Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 包含阿拉伯文和西文字符的字符串连接_Java_String_Internationalization_Arabic - Fatal编程技术网

Java 包含阿拉伯文和西文字符的字符串连接

Java 包含阿拉伯文和西文字符的字符串连接,java,string,internationalization,arabic,Java,String,Internationalization,Arabic,我正在尝试连接几个同时包含阿拉伯语和西文字符(混合在同一个字符串中)的字符串。问题是结果是一个字符串,它很可能在语义上是正确的,但与我想要得到的不同,因为Unicode双向算法改变了字符的顺序。基本上,我只想将它们连接起来,就好像它们都是LTR一样,忽略了一些是RTL的事实,这是一种“不可知”的连接 我不确定我的解释是否清楚,但我认为我不能做得更好 希望有人能帮助我 亲切问候, 卡洛斯·费雷拉 顺便说一句,字符串是从数据库中获取的 编辑 前两个字符串是我要连接的字符串,第三个是结果 编辑2 实

我正在尝试连接几个同时包含阿拉伯语和西文字符(混合在同一个字符串中)的字符串。问题是结果是一个字符串,它很可能在语义上是正确的,但与我想要得到的不同,因为Unicode双向算法改变了字符的顺序。基本上,我只想将它们连接起来,就好像它们都是LTR一样,忽略了一些是RTL的事实,这是一种“不可知”的连接

我不确定我的解释是否清楚,但我认为我不能做得更好

希望有人能帮助我

亲切问候,

卡洛斯·费雷拉

顺便说一句,字符串是从数据库中获取的

编辑

前两个字符串是我要连接的字符串,第三个是结果

编辑2


实际上,连接的字符串与图像中的字符串略有不同,它在复制+粘贴过程中发生了更改,1位于第一个a之后,而不是第二个a之前。

它没有改变码点的顺序。当显示字符串时,它会看到字符串以从右到左的脚本开头,因此它会从右到左显示字符串。

很可能需要在字符串中插入Unicode方向格式代码,才能正确显示字符串。有关详细信息,请参阅Unicode双向算法规范


也许该类可以帮助您确定正确的序列,因为它实现了Unicode双向算法。

您可以使用Unicode格式控制码点嵌入bidi区域:

  • 从左到右嵌入(U+202A)
  • 从右向左嵌入(U+202B)
  • Pop方向格式(U+202C)
因此,在java中,要将一种RTL语言(如阿拉伯语)嵌入到一种LTR语言(如英语)中,您可以这样做

myEnglishString + "\u202B" + myArabicString + "\u202C" + moreEnglish
而反过来呢

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

有关更多详细信息或源材料,请参阅。

能否发送一些测试数据(即2个字符串)。能否向我们展示一些示例?嗯,我尝试过,但当我复制字符串时,它们会被更改。您可以使用剪切工具捕获图片并将其插入此处Bidi类有助于确定序列,但我不知道如何强制它将字符串视为LTR而不是RTL。但我会看一看你提到的链接,也许我能找到它。谢谢。我没有这方面的经验,但似乎您必须使用隐式方向标记LRM(U+200E)和RLM(U+200F)的组合,它们不显示,以及方向代码终止符PDF(U+202C)。在上还有一个在线演示,您可以在那里进行测试。@MicSim这对我很有用,谢谢您为我指明了正确的方向。这不是直觉。我在if/else中使用了class
Bidi.requiresBidi(…)
,然后这样做:
StringBuilder stbr=newstringbuilder();stbr.追加(“\u200e”)//“LRM”我知道它不会改变顺序,但我如何才能防止这种行为?在Java/Android中有没有办法删除所有这些字符和其他在打印时不会显示的字符?我需要它来对字符串列表进行排序,但其中一些字符串具有特殊字符“\u202B”,这会破坏列表项的顺序。使用trim()函数不会删除它们。@androiddeveloper,您最好的选择可能是通过执行类似于
myString.replaceAll(“[^\t\r\n\\p{Graph}]+”,“”)的操作来除去除图形字符或空格字符以外的所有字符。我想不起来了,但使用Z类减去零宽度空格可能是“可打印”空格字符的最佳近似值。检查输入字符串的每个字符,如果“character.isIdentifierIgnorable(c)”返回false,将其添加到新字符串中如何?这就足够了吗?@androiddeveloper,如果这是您想要的,那么
.replaceAll([\\p{identifier ignorable}]+“,”)
也应该这样做。它做同样的事情吗?问题是,为了清除这些特殊字符或其他字符,这个函数是否是正确的。通过测试,它似乎是,但我想确定。