чтение юникода - PullRequest
       15

чтение юникода

1 голос
/ 20 апреля 2010

Я использую Java io для извлечения текста с сервера, который может выводить символы, такие как é. затем выведите его с помощью System.err, они окажутся '?'. Я использую кодировку UTF8. в чем дело? int len ​​= 0;

char[] buffer = new char[1024];
OutputStream os = sock.getOutputStream();
InputStream is = sock.getInputStream();
os.write(query.getBytes("UTF8"));//iso8859_1"));

Reader reader = new InputStreamReader(is, Charset.forName("UTF-8"));
do {
    len = reader.read(buffer);
    if (len > 0) {
        if (outstring == null) {
            outstring = new StringBuffer();
        }
        outstring.append(buffer, 0, len);
    }
} while (len > 0);
System.err.println(outstring);

Редактировать: только что попробовал следующий код:

StringBuffer b = new StringBuffer();
for (char c = 'a'; c < 'd'; c++) {
    b.append(c);
}
b.append('\u00a5'); // Japanese Yen symbol
b.append('\u01FC'); // Roman AE with acute accent
b.append('\u0391'); // GREEK Capital Alpha
b.append('\u03A9'); // GREEK Capital Omega

for (int i = 0; i < b.length(); i++) {
    System.out.println("Character #" + i + " is " + b.charAt(i));
}
System.out.println("Accumulated characters are " + b);

тоже оказался мусором:

Character #0 is a
Character #1 is b
Character #2 is c
Character #3 is ¥
Character #4 is ?
Character #5 is ?
Character #6 is ?
Accumulated characters are abc¥???

Ответы [ 3 ]

2 голосов
/ 20 апреля 2010

Сначала убедитесь, что системное свойство (file.encoding) на самом деле UTF8.Если это так, то ваша проблема не в том коде, который вы запускаете, а в том, что ваша терминальная программа (или другой выводной дисплей) не может правильно отобразить вывод.

0 голосов
/ 20 апреля 2010

Ваш второй пример производит для меня следующий вывод.

Character #0 is a
Character #1 is b
Character #2 is c
Character #3 is ¥
Character #4 is Ǽ
Character #5 is Α
Character #6 is Ω
Accumulated characters are abc¥ǼΑΩ

Этот код создает правильно закодированный файл UTF-8 с таким же содержимым.

StringBuilder b = new StringBuilder();
for (char c = 'a'; c < 'd'; c++) {
    b.append(c);
}
b.append('\u00a5'); // Japanese Yen symbol
b.append('\u01FC'); // Roman AE with acute accent
b.append('\u0391'); // GREEK Capital Alpha
b.append('\u03A9'); // GREEK Capital Omega

PrintStream out = new PrintStream("temp.txt", "UTF-8");
for (int i = 0; i < b.length(); i++) {
    out.println("Character #" + i + " is " + b.charAt(i));
}
out.println("Accumulated characters are " + b);

См. Также: Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Unicode и наборах символов (без оправданий!)

0 голосов
/ 20 апреля 2010

запишите это в файл и проверьте, как оно происходит. если он поступает правильно в файле, то это проблема с вашим потоком ошибок (кодировка не UTF-8). если он также присутствует в качестве ненужного символа в кодировке сервера, возможно, не UTF-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...