Java Map, как правильно разместить строку UTF-8 на карте? - PullRequest
3 голосов
/ 13 мая 2011

У меня есть карта, точнее LinkedHashMap. И я хочу поместить в него строковый объект. А потом я читаю это значение, чтобы увидеть, что на самом деле хранится. Сама строка имеет символы не ascii (кириллица, корейский и т. Д.). Как только я помещаю это в карту и затем читаю, эти символы заменяются на ??? s. Какой-то код:

Map obj = new LinkedHashMap();
System.out.println("name: " + getName());  // prints "i4niac_сим_sim"
obj.put("name", getName());
System.out.println("written stuff: " + obj.get("name"));  // prints i4niac_???_sim

В чем тут подвох? Я использую эту карту для создания объекта JSON с помощью json-simple и отправки его с сервера на клиент.

Обновление:

Тьфу, извини за весь этот беспорядок. Сначала я обвинил хранилище данных, затем карту, наконец, как и ожидалось, это была моя вина в другом месте. Я отправлял данные json в движке приложения, задавая тип контента как «application / json»

public void doPost(HttpServletRequest req, HttpServletResponse resp) {
// ...
        resp.setContentType("application/json");
        resp.getWriter().println(jsonObj.toString());
}

Он просто никогда не отправлял его как UTF-8, независимо от того, какие трюки я пробовал на стороне сервера После изменения на

    resp.setCharacterEncoding("UTF-8");

Наконец-то я получил escape-коды UTF-8 для не-ascii символов.

Ответы [ 3 ]

0 голосов
/ 13 мая 2011

Перекомпилируйте ваш код с -encoding флагом

как это

javac -encoding UTF-8 Test3.java
0 голосов
/ 13 мая 2011

Java Map, как правильно разместить строку UTF-8 на карте?

Строки неизменяемы и всегда кодируются как UTF-16.Если вы хотите представить символьные данные в любой другой кодировке, вы должны использовать байтовый массив.

Поскольку LinkedHashMap не изменяет и не сериализует вашу строку, значение объекта, которое вы помещаете вэто должен быть возвращенный ответ.

Единственное объяснение, которое я могу придумать:

  • getName() не возвращает ссылку на одну и ту же строку каждый раз (скорее всего)
  • System.out PrintWriter изменяется одновременно
  • кодировка консоли, принимающей данные, изменяется одновременно

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

public static String toCodeUnits(String s) {
  StringBuilder sb = new StringBuilder();
  for(char codeUnit : s.toCharArray()) {
    sb.append(String.format("%04x ", (int) codeUnit));
  }
  return sb.toString();
}

Для i4niac_сим_sim этот код вернет:

"0069 0034 006e 0069 0061 0063 005f 0441 0438 043c 005f 0073 0069 006d "
0 голосов
/ 13 мая 2011

откуда вы знаете, что символы заменены на ???- разве в вашей консоли не задана кодовая страница ASCII или что-то подобное?Или это не тот случай, когда шрифт, который вы использовали в консоли, не обрабатывает символы UTF-8 должным образом?Вы пытались записать все это в файл и открыть его в чем-то вроде MS Word и проверить, так ли это?

...