星号字母错误对齐java
当我以阿拉伯语查看文本向右对齐的列表项时,会出现错误的格式。 在所有阿拉伯语语句中,它都可以正常工作。[arWord].25.3但只有当文本为星号字母错误对齐java,java,string,string-formatting,Java,String,String Formatting,当我以阿拉伯语查看文本向右对齐的列表项时,会出现错误的格式。 在所有阿拉伯语语句中,它都可以正常工作。[arWord].25.3但只有当文本为*时,它才是这样的。 结果:.22.1.* 代码: 预期的:*.22.1[左边的星号] 结果:.22.1.* 编辑: 这个问题也出现在像،'这样的其他角色身上 这是一个非常有趣的问题。我决定更多地玩弄它,是的,我可以在这里复制你的问题。我的take is*不是阿拉伯语文本,因此它不应用语言格式 以下是我的测试:- @Test public void tes
*
时,它才是这样的。
结果:.22.1.*
代码:
预期的:*.22.1
[左边的星号]
结果:.22.1.*
编辑:
这个问题也出现在像،'这样的其他角色身上 这是一个非常有趣的问题。我决定更多地玩弄它,是的,我可以在这里复制你的问题。我的take is
*
不是阿拉伯语文本,因此它不应用语言格式
以下是我的测试:-
@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
,则可以使用库来执行此操作。这个图书馆似乎需要图书馆才能工作。。。是的,我知道它是用日语写的,我自己也不读日语。。。只需找到jsonic1.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);
}
}
}
请记住,此解决方案有点过火,可能会对非阿拉伯语语言产生意外的副作用。在字母前添加此unicode
\u200F
字符可解决此问题。它强制从右向左执行任何操作:
arabicFormat = String.format(new Locale(Language.Arabic.getCode(),
Language.Arabic.getCountry()), "%d.%d.\u200F%s", 22,
1, navText);
换句话说,它很好用。arWord.25.3但是只有当文本是*时,它看起来像这样。是
navText
星号吗?是的。如果是星号,则会出现此问题。任何其他单词都可以很好地使用,星号是格式的最后一部分。如果你是这样想的,也许你应该把它放在前面,因为你认为问题是星号特定的或任何特殊的字符?但是这里的输出看起来是22.1.*,我需要它像阿拉伯字母一样是*.22.1。
arabicFormat = String.format(new Locale(Language.Arabic.getCode(),
Language.Arabic.getCountry()), "%d.%d.\u200F%s", 22,
1, navText);