我正在构建支持阿拉伯语和英语的应用程序。
我有一个列表,我希望用户输入一个字符串,以便我可以找到他的字符串是否存在于列表中。
我用这个:
String userstring = bla bla bla;
for (int i = 0; i < allFoods.size(); i++) {
if (allFoods.get(i).toLowerCase().contains(userstring.toLowerCase()))
//do something here
}
当用户输入的单词是英语时,该代码可以正常工作。但是当用户输入阿拉伯语字符串
时,我没有得到任何结果我做错了什么?我该怎么办?
谢谢你。答案 0 :(得分:1)
如果您想进行字符串比较,可以使用Collator
API:
List<String> list = ...;
// create collator for arabic
Collator collator = Collator.getInstance(new Locale("ar"));
collator.setDecomposition(Collator.FULL_DECOMPOSITION);
collator.setStrength(Collator.SECONDARY); // ignores lower/upper case
// sort list
Collections.sort(list, collator);
// or use it as any other comparator
我不知道这个API是否可以某种方式用于测试String是否包含在另一个中。
答案 1 :(得分:0)
你的问题在于toLowerCase。即使utf-8似乎解决了基本的比较问题,当谈到使字符串小写时,java自然会感到困惑,因为它不知道你希望这些字母如何制作小写。例如土耳其小写的'我'是'ı'不是'我',因此。
首先使用java -Dfile.encoding = UTF-8启动应用程序...这是一个常见错误,运行没有utf-8编码的应用程序
这是我的解决方案;我添加了所有想要的语言环境,然后测试每个语言环境;
public class MultiLanguageComparator {
Set<Locale> localeList = new HashSet<Locale>();
public MultiLanguageComparator() {
localeList.add(Locale.getDefault());
localeList.add(Locale.ENGLISH);
}
public MultiLanguageComparator(String localePrefix) {
this();
Locale[] locales = Locale.getAvailableLocales();
localePrefix = localePrefix.toLowerCase(Locale.ENGLISH);
for (Locale l : locales) {
if (l.toLanguageTag().startsWith(localePrefix)) {
localeList.add(l);
}
}
}
/**
* if s1 contains s2 returns true
*
* @param s1
* @param s2
* @return
*/
public boolean contain(String s1, String s2) {
for (Locale locale : localeList) {
String tmp1 = s1.toLowerCase(locale);
String tmp2 = s2.toLowerCase(locale);
if (tmp1.contains(tmp2)) return true;
}
return false;
}
public static void main(String[] args) {
Locale[] locales = Locale.getAvailableLocales();
String s1 = ....
String s2 = ....
MultiLanguageComparator comparator = new MultiLanguageComparator("ar"); // as you want to add arabic locales, I suppose all of them or you may just add ar-sa for suudi arabia locale
System.out.println(comparator.contain(s1, s2));
}
}
答案 2 :(得分:0)
我很难比较德国弦和变音弦。我使用了 Unicode转义,它解决了我的问题。您可以找到列表here。
我直接在字符串中使用了 Unicode转义。
String mystring = "GERÄT";
mystring.equals("GER\u00C4T");
答案 3 :(得分:-1)
在比较之前将字符串字符集转换为ISO-8859-6(阿拉伯语):
在java中转换charset:
Charset utf8charset = Charset.forName("UTF-8");
Charset iso88596charset = Charset.forName("ISO-8859-6");
ByteBuffer inputBuffer = ByteBuffer.wrap(new byte[]{(byte)0xC3, (byte)0xA2});
// decode UTF-8
CharBuffer data = utf8charset.decode(inputBuffer);
// encode ISO-8859-6
ByteBuffer outputBuffer = iso88596charset.encode(data);
byte[] outputData = outputBuffer.array();
代码here。