代码之家  ›  专栏  ›  技术社区  ›  Kaushik Lele

HashMap的行为不符合中文字符的预期

  •  0
  • Kaushik Lele  · 技术社区  · 8 年前
    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
    

    地图加载正确,但当我搜索地图中的“中国-”-我没有得到值。

    如果我明确地将“中国”放在地图中,那么它将返回一个值。 为什么会这样?

    3 回复  |  直到 8 年前
        1
  •  1
  •   wumpz    8 年前

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

    第二种可能性是源代码文件不是UTF-8。因此,资源文件和源代码文件的“China-”字节序列不相等,您将无法获得匹配。但是,如果您显式地将该值包含在源代码字节序列中,它将被找到。

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

        2
  •  1
  •   Community Johnny    7 年前

    由于第一个值有问题,我将检查文件是否以 BOM (字节顺序标记)。

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

    见: Byte order mark screws up file reading in Java

        3
  •  0
  •   Tom Grylls    8 年前

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

    BufferedReader br= new BufferedReader(new InputStreamReader(new BOMInputStream(new FileInputStream("filepath")),"UTF-8"))