Преобразование UTF-8 к ISO-8859-1 в Java

Я думаю, что большинство людей называет это идиомой Тела Дескриптора. См. книгу James Coplien Усовершенствованные Стили Программирования на C++ и Идиомы ( ссылка Amazon ). Это также известно как Чеширский кот из-за символа Lewis Caroll, который исчезает, пока только усмешка не остается.

пример кода должен быть распределен через два набора исходных файлов. Затем только Cat.h является файлом, который поставляется с продуктом.

CatImpl.h включен Cat.cpp, и CatImpl.cpp содержит реализацию для CatImpl:: Мурлыканье (). Это не будет видимо общественности, использующей Ваш продукт.

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

Мы сделали это с переписыванием продукта IONAs Orbix 3.3 в 2000.

, Как упомянуто другими, с помощью его техники полностью отделяет реализацию от интерфейса объекта. Затем Вы не должны будете перекомпилировать все, что использует CAT, если Вы просто хотите изменить реализацию Мурлыканья ().

Эта техника используется в методологии, названной дизайн контракта .

12
задан Chocula 13 August 2009 в 19:08
поделиться

2 ответа

Я не уверен, есть ли в стандартной библиотеке процедура нормализации, которая сделает это. Я не думаю, что преобразование "умных" кавычек выполняется стандартными процедурами нормализатора Unicode , но не цитируйте меня.

Разумнее всего сделать дамп ISO-8859- 1 и начните использовать UTF-8 . Тем не менее, можно закодировать любую обычно разрешенную кодовую точку Unicode в HTML-страницу, закодированную как ISO-8859-1 . Вы можете закодировать их с помощью управляющих последовательностей , как показано здесь:

public final class HtmlEncoder {
  private HtmlEncoder() {}

  public static <T extends Appendable> T escapeNonLatin(CharSequence sequence,
      T out) throws java.io.IOException {
    for (int i = 0; i < sequence.length(); i++) {
      char ch = sequence.charAt(i);
      if (Character.UnicodeBlock.of(ch) == Character.UnicodeBlock.BASIC_LATIN) {
        out.append(ch);
      } else {
        int codepoint = Character.codePointAt(sequence, i);
        // handle supplementary range chars
        i += Character.charCount(codepoint) - 1;
        // emit entity
        out.append("&#x");
        out.append(Integer.toHexString(codepoint));
        out.append(";");
      }
    }
    return out;
  }
}

Пример использования:

String foo = "This is Cyrillic Ya: \u044F\n"
    + "This is fraktur G: \uD835\uDD0A\n" + "This is a smart quote: \u201C";

StringBuilder sb = HtmlEncoder.escapeNonLatin(foo, new StringBuilder());
System.out.println(sb.toString());

Выше символ ЛЕВОЙ ДВОЙНОЙ ЦИТАТЫ ( U + 201C «) является закодирован как & # x201C ;. Аналогичным образом кодируется пара других произвольных кодовых точек.

Необходимо соблюдать осторожность при использовании этого подхода.

14
ответ дан 2 December 2019 в 07:22
поделиться

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

byte[] latin1 = sb.toString().getBytes("ISO-8859-1");

return new String(latin1);

В Java String / Char всегда находится в UTF-16BE. Другая кодировка задействуется только при преобразовании символов в байты. Допустим, ваша кодировка по умолчанию - UTF-8, буфер latin1 обрабатывается как UTF-8, а некоторая последовательность Latin-1 может образовывать недопустимую последовательность UTF-8, и вы получите?.

4
ответ дан 2 December 2019 в 07:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: