当我使用阿拉伯语查看右侧对齐文本的列表项时,会出现格式错误。
在所有阿拉伯语声明中,它运作正常。 [arWord] .25.3但只有在文本为*
时才会出现这种情况。
结果:.22.1.*
CODE:
arabicFormat = String.format(new Locale(Language.Arabic.getCode(),
Language.Arabic.getCountry()), "%d.%d.%s",position,
(h.getSeq() + 1), navText);
预期:*.22.1
[左侧的星号]
结果:.22.1.*
编辑: 这个问题也出现在其他人物身上,'。
答案 0 :(得分:4)
这是一个非常有趣的问题。我决定更多地玩它,是的,我可以在这里复制你的问题。我的看法是*
不是阿拉伯语文本,因此它不会在其上应用语言格式。
以下是我的测试: -
@Test
public void testArabicLanguage() {
// arabic
assertThat(toArabicLanguage("قضاة وحقوقيون يكشفون "), is("22.1.قضاة وحقوقيون يكشفون "));
// english
assertThat(toArabicLanguage("hey"), is("22.1.hey"));
// chinese
assertThat(toArabicLanguage("现在进入"), is("22.1.现在进入"));
// symbol
assertThat(toArabicLanguage("*"), is("22.1.*"));
}
private String toArabicLanguage(String navText) {
String s = String.format(new Locale("ar", "DZ"), "%d.%d.%s", 22, 1, navText);
System.out.println(s);
return s;
}
当我执行上述测试时,一切都过去了。
然而,当我直接在IntelliJ中查看控制台打印输出和测试时,我看到阿拉伯语文本从右向左显示。
每当我在这里复制并粘贴文本时,它总是从左到右显示。
这是控制台打印输出: -
22.1.قضاة وحقوقيون يكشفون
22.1.hey
22.1.现在进入
22.1.*
现在,将它与我在IntelliJ中看到的相比,阿拉伯语文本从右向左显示: -
<强>更新强>
如果您想要的是始终首先显示navText
,则可以使用language-detection库来执行此操作。这个库似乎需要jsonic库才能使它工作......是的,我知道它是日语的,我自己也不读日语...只需查找jsonic 1.3 (1.3.0)
并下载即可。
有了这个,你可以这样做: -
public class MyTest {
// language-detection zip file comes with a `profile` dir... just point to it.
@Before
public void setup() {
try {
DetectorFactory.loadProfile("/path/to/language-detection/profiles");
}
catch (LangDetectException e) {
fail("Can't locate the language profiles");
}
}
@Test
public void testArabicLanguage() {
// arabic
assertThat(toArabicLanguage("قضاة وحقوقيون يكشفون "), is("22.1.قضاة وحقوقيون يكشفون "));
// english
assertThat(toArabicLanguage("hey"), is("hey.22.1"));
// chinese
assertThat(toArabicLanguage("现在进入"), is("现在进入.22.1"));
// symbol
assertThat(toArabicLanguage("*"), is("*.22.1"));
}
private String toArabicLanguage(String navText) {
boolean isArabicLanguage = false;
try {
Detector detector = DetectorFactory.create();
detector.append(navText);
isArabicLanguage = detector.detect().equals("ar");
}
catch (LangDetectException e) {
// `*` will throw this exception:-
// "com.cybozu.labs.langdetect.LangDetectException: no features in text"
//
// so, just catch it and treat it as non-Arabic language.
}
if (isArabicLanguage) {
return String.format(new Locale("ar", "DZ"), "%d.%d.%s", 22, 1, navText);
}
else {
return String.format("%s.%d.%d", navText, 22, 1);
}
}
}
请记住,此解决方案有点矫枉过正,可能会对非阿拉伯语言产生意想不到的副作用。
答案 1 :(得分:0)
问题通过在字母前添加此unicode \u200F
字符来解决问题。它强制执行任何事情的权利:
arabicFormat = String.format(new Locale(Language.Arabic.getCode(),
Language.Arabic.getCountry()), "%d.%d.\u200F%s", 22,
1, navText);