2015-02-12 4 views
0

Этот вопрос был затронут во многих дискуссиях, и все же мы по-прежнему видим, как появляются новые. Мой сценарий выглядит следующим образом:Кодировка символов Java, преобразование ISO в UTF

Рамка Java работает на сервере Linux, где UTF-8 является кодировкой символов по умолчанию в JVM. Структура состоит из некоторых служб, получающих сообщения Tibco RV для обработки. И некоторые из этих сообщений содержат символы не ASCII и отправляются с сервера Windows, а ISO8859-1 - это кодировка, используемая при создании сообщения. Теперь, когда данные извлекаются из сообщения Tib rv, проблемные поля «поступают» как объекты Java и должны быть переданы в строки ... И здесь я еще не смог извлечь строки ISO8859-1, содержащие не ASCII-символы (шведский) å "," ä "," ö ") в строку UTF-8. Я попытался с помощью следующих методов:

String isoStreet = new String(response.get("street").toString().getBytes(StandardCharsets.ISO_8859_1),java.nio.charset.StandardCharsets.UTF_8); 

, и я также попытался использовать кодеры/декодеры в java.nio пакета без успеха.

Что также интересно, так это то, что я использую PuttY для подключения к серверу, где службы хостены и работают. И оттуда у меня есть возможность сделать прямой запрос Tibco rv из оболочки (используя клиент tibcorvsend), и кажется, что мне нужно установить удаленный набор символов в ISO8859-1 в PuttY (Window_> Перевод), прежде чем войти в сервер и сделать запрос Tib rv - когда это будет сделано, те, которые не указаны в ASCII-символах, указаны в ответе, независимо от того, какую кодировку я установил на удаленном сервере Linux. Использование 'export LC_ALL = en_US.UTF-8' или 'export LC_ALL = sv_SE.iso88591' не имеет значения в этом случае ... только то, что удаленное кодирование, которое я установил в PuttY ...

Thsi должно подразумевать, что ответное сообщение кажется ОК, и, по крайней мере, оболочка может выводить правильные символы. Но когда внутри Java VM (с использованием Java-сервисов) я думаю, что поля ответов тихо вставляются в строки при отладке и просмотре объекта ответа (не желая этого преобразования в строки) в режиме просмотра просмотра ... не уверен, что вы могли бы следовать за мной на этом , если не я могу попытаться быть более ясным, если это необходимо ...

Любой вход по этой проблеме, любой

с уважением /R

ответ

1

character encoding определяет, как текст, который состоит из символов, является переводится в байты и наоборот. Как вы знаете, существуют различные кодировки символов, такие как ASCII, ISO-8859-1 и UTF-8.

Строка состоит из символов. В какой-то момент вы хотите преобразовать эти символы в байты, чтобы вы могли отправлять их по сети, хранить их в файле или в любом месте, которое вы хотите сделать. Вы используете кодировку символов для перевода строки в байты. А с другой стороны, где вы получаете байты, вы используете одну и ту же кодировку символов для перевода байтов обратно в символы в строке.

Давайте посмотрим, почему строка, подобная той, которую вы опубликовали, неверна. Давайте сначала переписать его так, что я могу объяснить детали:

String street = response.get("street").toString(); 
byte[] streetBytes = street.getBytes(StandardCharsets.ISO_8859_1); 
String isoStreet = new String(streetBytes, StandardCharsets.UTF_8); 

В первой строке, вы получаете некоторые данные из ответа и преобразовать его в строку. (Что возвращает response.get("street")?).

Во второй строке вы кодируете эту строку, используя набор символов ISO-8859-1. Вы получаете массив байтов, который содержит действительные коды символов ISO-8859-1 для символов в строке.

В третьей строке вы преобразуете байты в строку и делаете вид, что байты представляют собой байты UTF-8. Это, очевидно, неправильно, потому что байты являются данными ISO-8859-1, а не данными UTF-8. Когда вы это сделаете, вы можете получить неправильные символы или даже исключение, если массив байтов содержит последовательность байтов, которая не является допустимым символом в соответствии с UTF-8.

Следует помнить, что строка состоит из символов. Строка не имеет кодировки сама по себе. Вы используете кодировку символов для перевода строки в байты и наоборот. Вы не можете «изменить кодировку символов строки», потому что кодировка символов просто не является свойством строки. Точно так же, как число не является по сути десятичным или шестнадцатеричным - это просто разные способы представления одного и того же числа.

То, что вы должны сделать, это:

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

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

Не читайте что-нибудь в строке, используя кодировку по умолчанию для платформы, а затем попробуйте «преобразовать строку». Это не работает.

+0

Спасибо за ответ ... Одна из проблем заключается в том, что я не влияю на то, как создается ответ, который мы получаем. Это внешняя система, LDAP-сервер, работающий на сервере Windows. response.get ("fieldName") вернет объект (или поле null, если в ответе ответа Tibco нет) Но это фактически поле String - все поля в сообщении Tibco RV отправляются как объекты, но объекты больше контейнеров строк, целых чисел и т. д. Тем не менее, не знаю, как получить эти символы из ответного сообщения в строку Java (или байт []) –

+0

Хм, не уверен, что это был правильный способ дать ответ на ваш ответ ... возможно, я должен Вместо этого вы отправили ответ? –

+0

Вам нужно будет проанализировать свой код и узнать, что именно помещено в сообщении, и что именно вы выбрали из него. Надеюсь, мой ответ поможет вам понять кодировки символов, чтобы вы могли эффективно решить эту проблему. – Jesper

 Смежные вопросы

  • Нет связанных вопросов^_^