#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, этого не должно произойти.