Я думаю, что большинство людей называет это идиомой Тела Дескриптора. См. книгу James Coplien Усовершенствованные Стили Программирования на C++ и Идиомы ( ссылка Amazon ). Это также известно как Чеширский кот из-за символа Lewis Caroll, который исчезает, пока только усмешка не остается.
пример кода должен быть распределен через два набора исходных файлов. Затем только Cat.h является файлом, который поставляется с продуктом.
CatImpl.h включен Cat.cpp, и CatImpl.cpp содержит реализацию для CatImpl:: Мурлыканье (). Это не будет видимо общественности, использующей Ваш продукт.
В основном идея состоит в том, чтобы скрыться как можно больше реализации от любопытных глаз. Это является самым полезным, где у Вас есть коммерческий продукт, который поставляется как серия библиотек, к которым получают доступ через API, против которого код клиента скомпилирован и связан с.
Мы сделали это с переписыванием продукта IONAs Orbix 3.3 в 2000.
, Как упомянуто другими, с помощью его техники полностью отделяет реализацию от интерфейса объекта. Затем Вы не должны будете перекомпилировать все, что использует CAT, если Вы просто хотите изменить реализацию Мурлыканья ().
Эта техника используется в методологии, названной дизайн контракта .
Я не уверен, есть ли в стандартной библиотеке процедура нормализации, которая сделает это. Я не думаю, что преобразование "умных" кавычек выполняется стандартными процедурами нормализатора 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 ;. Аналогичным образом кодируется пара других произвольных кодовых точек.
Необходимо соблюдать осторожность при использовании этого подхода.
В зависимости от кодировки по умолчанию следующие строки могут вызвать проблемы,
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, и вы получите?.