Японская кодировка символов в Java

#java #unicode #cjk

#java #юникод #cjk #unicode

Вопрос:

Вот в чем моя проблема. Сейчас я использую Java Apache POI для чтения файла Excel (.xls или .xlsx) и отображения содержимого. В таблице есть несколько японских символов, и все японские символы, которые я получил, являются «???» в моем выводе. Я пытался использовать Shift-JIS, UTF-8 и многие другие способы кодирования, но это не работает… Вот мой код кодировки ниже:

 public String encoding(String str) throws UnsupportedEncodingException{
  String Encoding = "Shift_JIS";
  return this.changeCharset(str, Encoding);
}
public String changeCharset(String str, String newCharset) throws UnsupportedEncodingException {
  if (str != null) {
    byte[] bs = str.getBytes();
    return new String(bs, newCharset);
  }
  return null;
}
  

Я передаю каждую строку, которую я получил, в encoding (str). Но когда я печатаю возвращаемое значение, это все равно что-то вроде «???» (как показано ниже), но не японские символы (хирагана, катакана или кандзи).

 title-jp=???
  

Кто-нибудь может мне в этом помочь? Большое вам спасибо.

Комментарии:

1. Как вы «проверяете» результат? В командной строке Windows возникают проблемы с отображением международных символов. (как и в, шрифты обычно не устанавливаются, если языковой стандарт не установлен правильно)

Ответ №1:

Ваш changeCharset метод кажется странным. String объекты в Java лучше всего рассматривать как не имеющие определенного набора символов. Они используют Unicode и поэтому могут представлять все символы, а не только одно региональное подмножество. Ваш метод гласит: превратите строку в байты, используя набор символов моей системы (каким бы он ни был), а затем попробуйте интерпретировать эти байты, используя какой-либо другой набор символов (указанный в newCharset ), который поэтому, вероятно, не будет работать. Если вы преобразуете в байты в кодировке, вы должны прочитать эти байты с той же кодировкой.

Обновить:

Чтобы преобразовать строку в Shift-JIS (региональная кодировка, обычно используемая в Японии), вы можете сказать:

 byte[] jis = str.getBytes("Shift_JIS");
  

Если вы запишете эти байты в файл, а затем откроете файл в Блокноте на компьютере с Windows, где все региональные настройки ориентированы на Японию, Блокнот отобразит его на японском языке (поскольку больше ничего не нужно, он будет считать, что текст находится в локальной кодировке системы).

Однако вы также можете сохранить его как UTF-8 (с префиксом 3-байтовой вводной последовательности UTF-8), и Notepad также отобразит его как японский. Shift-JIS — это только один из способов представления японского текста в виде байтов.

Комментарии:

1. Итак, можете ли вы дать мне предложение о том, как преобразовать заданную строку в японскую кодировку? Большое спасибо

Ответ №2:

Я подозреваю, что вы не должны делать это в первую очередь. Если это действительно ошибка Apache POI, то вам нужно будет получить исходные необработанные байты из данных, а не просто использовать encdoing по умолчанию.

С другой стороны, я думаю, что вполне вероятно, что Apache POI удалось сделать все правильно, и это просто проблема с выводом. Я предлагаю вам сбросить полученную вами исходную строку (полностью удалив ваш encoding метод) с точки зрения ее кодовых точек Unicode, например

  for (int i = 0; i < text.length; i  ) {
     System.out.println("U "   Integer.toHexString(text.charAt(i));
 }
  

Затем сверьте эти значения в Юникоде с значениями на веб-сайте Unicode.

Комментарии:

1. Да, если он использует командную строку Windows для вывода символов, это объясняет проблемы. Однако, если он использует eclipse или другую IDE, этого не должно произойти.