Преобразование символов Юникода в строку, содержащую их представление u + [hexa] ("\ u2030") - PullRequest
4 голосов
/ 11 марта 2019

Я работаю с Java 8 и I18N.Насколько я понимаю, файлы .properties (и последующий код I18N) предполагают, что файлы имеют формат файла "ISO-8859-1".Таким образом, у меня возникают проблемы с символами, которые не могут быть представлены в этом формате файла.

Переход от средства записи файла к OutputStreamWriter не поможет, так как другой конец кода не сможет прочитать этисимволы в любом случае.

Я придумала решение, которое работает, но оно крайне не элегантное.

StringBuilder utfRepresentation = new StringBuilder();
for (int index = 0; index < input.length(); index++) {
    if (!Charset.forName("ISO-8859-1").newEncoder().canEncode(input.charAt(index))) {
        utfRepresentation.append("\\u");
        utfRepresentation.append(Integer.toHexString(input.codePointAt(index)));
    } else {
        utfRepresentation.append(input.charAt(index));
    }
}

Теперь мне нужно заняться другими вещами, такими как извлечение кодировщика вместо созданиякаждый раз новый, но мой вопрос совсем другой:

1) Есть ли более чистый способ преобразования в \u2030
2) Что даже это U + 2030?UTF-8/16?
3) Есть ли лучший способ создания этой кодировки / кодировщика?Что-то, что не является статичным?я могу извлечь это из файла?или программа чтения / записи файлов?

1 Ответ

3 голосов
/ 11 марта 2019

Как историческая аномалия, .properties находятся в ISO-8859-1, для которого вы можете использовать StandardCharsets.ISO_8859_1 (если не на Android).

Однако вы можете использовать для других символов U-escape-экранирование: \u2030 где следует понимать, что это представление UTF-16, хранящееся в одном char (два байта).Некоторые символы Юникода превышают двухбайтовый предел и кодируются в «суррогатную» пару.

  • При чтении из PropertyResourceBundle каждый \uXXXX будет автоматически декодирован
  • Вы можете преобразовать файл шаблона UTF-8 в u-escape-.properties;например в мавене.
  • Иногда ListResourceBundle лучше подходит.Он имеет массив в Java, все источники Java могут быть установлены в UTF-8 для международного проекта.Его поведение отличается: все строки загружаются немедленно.

Однако, очевидно, вы также хотите записать в .properties в коде;следовательно, не на пути к классам.

Здесь лучше всего выглядит Свойства

Для этого класс Properties идеален,Он имеет вариант XML (вместо строк ключ-значение) для свойств, которые по умолчанию используют UTF-8.Но также традиционные свойства .properties можно читать и записывать в другой кодировке (UTF-8).


StringBuilder utfRepresentation = new StringBuilder();
for (int index = 0; index < input.length(); index++) {
    char ch = input.charAt(index);
    if (ch < 128) {
        utfRepresentation.append(ch);
    } else {
        utfRepresentation.append(String.format("\\u%04X", ch));
    }
}
...