0

В моем присвоенном проекте, оригинальный автор написал функцию:Обработка китайских струн в Java?

public String asString() throws DataException 
    { 
    if (getData() == null) return null; 

    CharBuffer charBuf = null; 

    try 
    { 
     charBuf = s_charset.newDecoder().decode(ByteBuffer.wrap(f_data)); 
    } 
    catch (CharacterCodingException e) 
    { 
     throw new DataException("You can't have a string from this ParasolBlob: " + this, e); 
    } 

    return charBuf.toString()+"你好"; 
} 

Обратите внимание, что константа s_charset определяются как:

private static final Charset s_charset = Charset.forName("UTF-8"); 

Пожалуйста, обратите внимание, что я жестко закодирован китайским string в возвращаемой строке.

Теперь, когда поток программы достигает этот метод, он будет бросать следующее исключение:

java.nio.charset.UnmappableCharacterException: Input length = 2 

И еще Interstingly, жестко закодированные китайские строки будут показаны как «??» на консоли, если я сделаю System.out.println().

Я думаю, что эта проблема весьма интересна в отношении Локализации. И я попытался изменить его на Charset.forName («GBK»);

но похоже не решение. Кроме того, я установил кодировку класса Java как «UTF-8».

У любого эксперта есть опыт в этом отношении? Не могли бы вы поделиться им? Заранее спасибо!

ответ

3

И более интересно, жестко закодированные китайские строки будут показаны как "??" на консоли, если я сделаю System.out.println().

System.out выполняет операции транскодирования из строк UTF-16 в кодировку символов JRE по умолчанию. Если это не соответствует кодировке, используемой устройством, получающему символьные данные, повреждается. Таким образом, консоль должна быть настроена на использование правильной кодировки символов (UTF-8) для правильного отображения китайских символов.

Если вы используете затмение, то вы можете изменить кодировку консоли, перейдя в

Run Конфигурация-> Общие -> Кодировка (Slect UTF-8 из выпадающего списка)

enter image description here

+0

+1, однако я не уверен, что OP означает консоль затмения. Если вы используете, например, окна, это сложнее. Но эта дискуссия поможет вам: http://stackoverflow.com/questions/388490/unicode-characters-in-windows-command-line-how – AlexR

+0

Теперь он отлично работает на моей консоли, спасибо. Но моя конечная цель - извлечь строки и вывести их в файл csv. Это все еще показано как ??? в файле csv. Я уже установил кодировку для csv. – Kevin

+0

@ Kevin Читать [это] (http://stackoverflow.com/a/16436195/1163607). – NINCOMPOOP

0

Java Строки юникодов

System.out.println("你好"); 
0

Как сказал Кевин, в зависимости от того, что является базовой кодировкой исходного файла, эта кодировка будет использоваться для преобразования ее в UTF-16BE (реальная кодировка Java String). Итак, когда вы видите "??" это, безусловно, простая ошибка преобразования.

Теперь, если вы хотите преобразовать простой массив байтов в String, используя заданную кодировку символов, я считаю, что есть намного более простой способ сделать это, чем использовать raw CharsetDecoder. То есть:

byte[] bytes = {0x61}; 
String string = new String(bytes, Charset.forName("UTF-8")); 
System.out.println(string); 

Это будет работать при условии, что массив байтов действительно содержит кодированный поток байтов UTF-8. И это должно быть без BOM, иначе конверсия, вероятно, не удастся. Убедитесь, что то, что вы пытаетесь преобразовать, не начинается с последовательности 0xEF 0xBB 0xBF.

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

  • Нет связанных вопросов^_^