Японская кодировка символов в Java - PullRequest
4 голосов
/ 08 октября 2011

Вот моя проблема.Сейчас я использую 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;
}

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

title-jp=???

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

Ответы [ 2 ]

2 голосов
/ 08 октября 2011

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

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

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

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

2 голосов
/ 08 октября 2011

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

Обновление

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

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

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

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

...