HashMap对中文字符

时间:2016-12-23 07:03:28

标签: java utf-8 chinese-locale

China-中国,CN
Angola-安哥拉,AO
Afghanistan-阿富汗,AF
Albania-阿尔巴尼亚,AL
Algeria-阿尔及利亚,DZ
Andorra-安道尔共和国,AD
Anguilla-安圭拉岛,AI

在Java中,我从文件中读取上述文本并创建一个地图,其中键将是逗号之前的部分,值将是逗号之后的区域代码。

以下是代码:

public static void main(String[] args) {

    BufferedReader br;
    Map<String,String>  mymap = new HashMap<String,String>();
    try {
        br = new BufferedReader(new InputStreamReader(new FileInputStream("C:/Users/IBM_ADMIN/Desktop/region_code_abbreviations_Chinese.csv"), "UTF-8"));
        String line;
        while ((line = br.readLine()) != null) {
           //System.out.println(line);
           String[] arr= line.split(",");
           mymap.put(arr[0], arr[1]);
        }

        br.close();
    } catch (IOException e) {
        System.out.println("Failed to read users file.");
    } finally {}

    for(String s: mymap.keySet()){
        System.out.println(s);
        if(s.equals("China-中国")){
            System.out.println("Got it");
            break;
        }
    }

    System.out.println("----------------");
    System.out.println("Returned from map  "+ mymap.get("China-中国"));

    mymap = new HashMap<String,String>();
    mymap.put("China-中国","Explicitly Put");
    System.out.println(mymap.get("China-中国"));
    System.out.println("done");
}

输出:

:
:
Egypt-埃及
Guyana-圭亚那
New Zealand-新西兰
China-中国
Indonesia-印度尼西亚
Laos-老挝
Chad-乍得
Korea-韩国
:
:
Returned from map  null
Explicitly Put
done

正确加载地图,但是当我在地图上搜索&#34; China-中国&#34; - 我没有得到价值。

如果我明确表示&#34;中国 - 中国&#34;在map中,然后它返回一个值。 为什么会这样?

3 个答案:

答案 0 :(得分:1)

由于您遇到第一个值的问题,我会检查文件是否以BOM(字节顺序标记)开头。

如果是这样,请在处理之前尝试剥离BOM。

请参阅:Byte order mark screws up file reading in Java

答案 1 :(得分:1)

检查您的资源文件是否不是UTF-8,例如UTF-8Y,一开始就有BOM字节。但这只能用第一个值来推断。如果您将测试更改为中间的值,您是否有值?如果没有那么这不是问题。

第二种可能性是您的源代码文件不是UTF-8。因此,&#34;中国 - 中国&#34;的字节序列您的资源文件和源代码文件不相等,您将无法获得匹配。但是你明确地在源代码字节序列中包含了值,它将被找到。

实际上,这不是HashMap的问题,而是字符或文件编码。

答案 2 :(得分:0)

您可以使用org.apache.commons.io.input.BOMInputStream。

C:\\e.txt