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

问题描述 投票:1回答:3

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

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

我用这个:

String userstring = bla bla bla;

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

当用户输入的单词是英语时,该代码可以正常工作。但是当用户输入阿拉伯字符串时,我没有得到任何结果

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

感谢你。

edit: i don't want to sort and compare strings, but i want to check the equality (contain)

java string localization
3个回答
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是否包含在另一个中。


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));

    }
}

-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

© www.soinside.com 2019 - 2024. All rights reserved.