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

В Java я читаю приведенный выше текст из файла и создаю карту, где ключи будут частью перед запятой, а значениями будут код региона после запятой.HashMap не ведет себя так, как ожидалось, для китайских иероглифов

Вот код:

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 

Карта загружается правильно, но когда я ищу карту для «Китай- 中国» - я не получаю значения.

Если я явно помещаю «Китай-中国» в карту, то он возвращает значение. Почему это происходит?

+0

Просьба уточнить. Вывод, который вы получаете, не может исходить из кода, который вы опубликовали. –

+0

System.out.println («Возврат с карты» + mymap.get («Китай-中国»)); почему он печатает нуль? –

+0

Создается ли файл с помощью спецификации? –

ответ

1

Проверьте, если ваш файл ресурс не UTF-8, например, UTF-8Y, с BOM Bytes в начале. Но это будет означать только первое значение. Если вы измените тест на значение с середины, вы имеете значение или нет? Если нет, это не проблема.

Вторая возможность - это ваш исходный код не UTF-8. Поэтому байтовая последовательность «China-中国» вашего файла ресурсов и вашего файла исходного кода не равна, и вы не получите соответствия. Но вы указываете значение с байтовой последовательностью исходных кодов явно, и оно будет найдено.

На самом деле это не проблема с HashMap, а с кодировкой символов или файлов.

+0

Взрыв на !! Да, я искал другой ключ, кроме первого, он работал. Затем я добавил фиктивное слово в первую строку. Он работал хорошо для второй строки вперед. Как определить, есть ли у него нежелательные символы в начале. –

+0

@KaushikLele 1. первая возможность, упомянутая wumpz, является дубликатом моего ответа, также я предоставил ссылку на рекомендуемые решения. (было бы неплохо, если бы первый человек, чтобы опубликовать ответ, получил кредит ...) 2. Вторая возможность, упомянутая wumpz, даже не возможна, основываясь на данном выходе. –

+0

Упс. Я не собирался дублировать. Сожалею. – wumpz

1

Поскольку у вас возникла проблема с первым значением, я проверил бы, будет ли файл начинаться с BOM (отметка байтового байта).

Если это так, попробуйте удалить спецификацию перед обработкой.

См: Byte order mark screws up file reading in Java

+0

Да, длина отличается. Проверьте, что длина такая же? Если нет, измените кодировку файла на UTF-8 без формата кодировки спецификации. И это работает. –

0

Вы можете использовать org.apache.commons.io.input.BOMInputStream.

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

Но почему основной код Java не работает? –

+0

Первое значение строки - спецификация.Вы также можете использовать replace, чтобы сделать это. line.replace ("\ uFEFF", ""). Но только для кодировки UTF-8. –

Смежные вопросы