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

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

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

title-jp=???

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

4 голоса | спросил Allan Jiang 8 +04002011-10-08T22:17:28+04:00312011bEurope/MoscowSat, 08 Oct 2011 22:17:28 +0400 2011, 22:17:28

2 ответа


0

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

Обновление

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

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

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

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

ответил Daniel Earwicker 8 +04002011-10-08T22:26:34+04:00312011bEurope/MoscowSat, 08 Oct 2011 22:26:34 +0400 2011, 22:26:34
0

Я подозреваю, что вы не должны делать это в первую очередь. Если это действительно ошибка 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 .

ответил Jon Skeet 8 +04002011-10-08T22:42:51+04:00312011bEurope/MoscowSat, 08 Oct 2011 22:42:51 +0400 2011, 22:42:51

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132