Если ваша база данных содержит только один байт (со значением 0xC4), то вы не используете кодировку UTF-8.
Символ «LATIN CAPITAL LETTER A WITH DIAERESIS» имеет значение кодовой точки U + 00C4, но UTF-8 не может кодировать его в одном байте. Если вы проверите третий столбец «UTF-8 (hex.)» На UTF8-zeichentabelle.de, вы увидите, что UTF-8 кодирует его как 0xC3 84 (два байта).
Пожалуйста, прочитайте статью Джоэла " Абсолютный минимум, который должен знать каждый разработчик программного обеспечения. Абсолютно, положительно должен знать о Unicode и наборах символов (без оправданий!) " для получения дополнительной информации.
РЕДАКТИРОВАТЬ: Кристиан сам нашел ответ; Оказалось, что это была проблема в компоненте Cocoon 3 SAX (я думаю, что это версия альфа 3). Оказывается, что если вы передадите XML в виде String в класс XMLGenerator
, во время синтаксического анализа SAX что-то пойдет не так, что приведет к этому беспорядку.
Я посмотрел код , чтобы найти актуальную проблему в Cocoon-stax:
if (XMLGenerator.this.logger.isDebugEnabled()) {
XMLGenerator.this.logger.debug("Using a string to produce SAX events.");
}
XMLUtils.toSax(new ByteArrayInputStream(this.xmlString.getBytes()), XMLGenerator.this.getSAXConsumer();
Как вы можете видеть, вызов getBytes()
создаст байтовый массив с кодировкой JRE по умолчанию, который затем не удастся проанализировать. Это потому, что XML объявляет себя UTF-8, тогда как данные теперь снова в байтах и, вероятно, используют вашу кодовую страницу Windows.
В качестве обходного пути можно использовать следующее:
new org.apache.cocoon.sax.component.XMLGenerator(xmlInput.getBytes("UTF-8"),
"UTF-8");
Это вызовет правильные внутренние действия (как выяснил Кристиан, экспериментируя с API).
Я открыл проблему в баг-трекере Apache.
РЕДАКТИРОВАТЬ 2: проблема исправлена и будет включена в следующий выпуск.