Java: интерпретация UTF-8 в программе Java - PullRequest
0 голосов
/ 01 сентября 2011

Моя программа получает массив целых чисел из приложения браузера, которое интерпретируется как UTF-8 (пример в коде).Я могу вернуть мою результирующую строку ("theString", показанную в коде ниже) обратно в браузер, и все в порядке.Но это не нормально в программе Java.Входная строка "Hällo".Но он выводится из программы Java как "Hõllo".

import java.io.*;
import java.nio.charset.*;

public class TestCode {
   public static void main (String[] args) throws IOException {

      // H : 72
      // ä : 195 164
      // l : 108
      // o : 111
      // the following is the input sent from browser representing String = "Hällo"
      int[] utf8Array = {72, 195, 164, 108, 108, 111};

      String notYet = new String(utf8Array, 0, utf8Array.length);
      String theString = new String(notYet.getBytes(), Charset.forName("UTF-8"));

      System.out.println(theString);
   }
}

Ответы [ 2 ]

4 голосов
/ 01 сентября 2011

Это поможет:

int[] utf8Array = {72, 195, 164, 108, 108, 111};
byte[] bytes = new byte[utf8Array.length];
for (int i = 0; i < utf8Array.length; ++i) {
    bytes[i] = (byte) utf8Array[i];
}
String theString = new String(bytes, Charset.forName("UTF-8"));

Проблема с передачей int[] напрямую состоит в том, что класс String интерпретирует каждый int как отдельный символ, а после преобразования в byte[] String обрабатывает ввод как необработанные байты и понимает, что 195, 164 на самом деле это один символ, состоящий из двух байтов, а не двух символов.

ОБНОВЛЕНИЕ: Отвечая на ваш комментарий, к сожалению, Java является таким подробным. Сравните это со Scala:

val ints = Array(72, 195, 164, 108, 108, 111)
println(new String(ints map (_.toByte), "UTF-8"))

И снова разница между int и byte заключается не только в том, что компилятор требователен, они действительно означают разные вещи, когда дело доходит до кодировки UTF-8.

3 голосов
/ 01 сентября 2011

Вам нужно передать его байтами, а не целыми числами, чтобы вы могли использовать конструктор String, принимающий в качестве аргумента кодировку:

byte[] utf8Array = {72, (byte) 195, (byte) 164, 108, 108, 111};
String theString = new String(utf8Array, 0, utf8Array.length, "UTF-8");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...