java将字符串与英语以外的语言进行比较

时间:2013-12-05 07:32:50

标签: java string localization

我正在构建支持阿拉伯语和英语的应用程序。

我有一个列表,我希望用户输入一个字符串,以便我可以找到他的字符串是否存在于列表中。

我用这个:

String userstring = bla bla bla;

for (int i = 0; i < allFoods.size(); i++) {
    if (allFoods.get(i).toLowerCase().contains(userstring.toLowerCase()))
                    //do something here
            }

当用户输入的单词是英语时,该代码可以正常工作。但是当用户输入阿拉伯语字符串

时,我没有得到任何结果

我做错了什么?我该怎么办?

谢谢你。

编辑:我不想排序和比较字符串,但我想检查相等(包含)

4 个答案:

答案 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