Обработка кодировки UTF-8 - PullRequest
       14

Обработка кодировки UTF-8

2 голосов
/ 06 ноября 2008

На сервере Weblogic работает приложение Java, которое извлекает сообщения XML из очереди JMS или MQ и записывает их в другую очередь JMS. Приложение не изменяет содержимое XML никоим образом. Мы используем XMLObject BEA для чтения и записи сообщений в очереди.

XML-сообщения содержат объявления типа кодировки как UTF-8.

У нас есть проблема, когда XML содержит символы, которые находятся за пределами нормального диапазона ASCII (например, символ £). Когда сообщение читается из очереди, мы видим, что символ £ не поврежден, однако, как только мы записываем его в очередь назначения, символ £ теряется и заменяется вместо него на £.

Я проверил настройки уровня ОС (настройки локали), и все, кажется, в порядке. Что еще я должен проверять, чтобы этого не случилось?

Ответы [ 3 ]

5 голосов
/ 06 ноября 2008

как только мы записываем его в очередь назначения, символ £ теряется и заменяется на £ вместо

Это говорит о том, что символ записывается как UTF-8, но читается , как если бы он был в однобайтовой кодировке, такой как ISO-8859-1. (Для любого символа в диапазоне U + 00A0..U + 00BF, если вы закодируете его как UTF-8 и расшифруете как ISO-8859-1, вы получите последовательность из двух символов ÃX, где X - исходный символ.) Я бы посмотрел настройки кодирования получающей очереди JMS.

3 голосов
/ 06 ноября 2008

Вы должны использовать InputStream, OutputStream и byte[] для обработки документов XML, а не Reader, Writer и String. В мире JMS BytesMessage лучше подходит для полезных нагрузок XML, чем TextMessage.

Каждый документ XML определяет свою внутреннюю кодировку символов, и все API обработки XML ориентированы на прием байтовых потоков и, где необходимо, определяют правильную кодировку символов для использования сами. Текстовые API есть только здесь & hellip; путать людей, наверное! В любом случае приложения должны позволять процессору XML решать проблемы кодировки символов, а не пытаться самим управлять им (или использовать текстово-ориентированный API без четкого понимания проблем кодировки символов).

2 голосов
/ 06 ноября 2008

Без дополнительных подробностей я бы предположил, что есть метод, который по выбору берет кодировку где-то, что не указано и по умолчанию используется ISO-8859-1. Обычно проверяют все, что проходит между InputStream / OutputStream и Reader / Writer.

Например, OutputStreamWriter принимает необязательную кодировку, которую вы можете не указывать.

...