Как я могу найти байтовую кодировку сообщения о встрече в TIBCO?

StackOverflow https://stackoverflow.com/questions/911278

Вопрос

В моем Java-приложении я архивирую сообщения TIBCO RV в файл в виде байтов.

Я пишу небольшое служебное приложение, которое будет воспроизводить сообщения обратно.Таким образом, я могу просто создать объект TibrvMsg из байтов без необходимости разбирать файл и создавать объект вручную.

Проблема, с которой я сталкиваюсь, заключается в том, что я читаю файл, который был создан в Linux box, и пытаюсь запустить свое приложение на компьютере с Windows.Я получаю сообщение об ошибке из-за другой кодировки, в которую был записан файл.

Итак, теперь, что я хочу сделать, это записать каждое сообщение в определенной кодировке (UTF-8), так что мне все равно, на какой платформе я запускаю свое приложение для воспроизведения.Приложение должно просто читать в файле, заранее зная кодировку, в которую записан файл.Я планирую использовать для этого пакеты java.nio, чтобы преобразовать байты из одной кодировки в другую.

Нужно ли мне знать, в какой кодировке закодированы байты сообщения TIBRV, чтобы выполнить преобразование?Если да, то как я могу это выяснить?

Это было полезно?

Решение

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

Непрозрачные данные следует рассматривать как бессмысленные и просто сохранять без изменений, чтобы передать обратно API, который знает, как с ними обращаться.Если данные должны храниться в текстовой форме, то вы должны без потерь преобразуйте байты в текст.Подходящие кодировки - это такие вещи, как base64.Кодирование в смысле кодировки набора символов НЕ является без потерь, если вы применяете его к необработанным двоичным данным.

Простое сохранение байтов в файле в виде байты (не символы) наряду с префиксом фиксированной длины, указывающим длину сообщения и тему, на которую оно было отправлено, достаточно для воспроизведения сообщений RV через систему.

Что касается любых текстовых полей внутри сообщения, если кодировка имеет значение (я настоятельно рекомендую избегать этого значения вообще при разработке приложения), то при воспроизведении у вас возникает та же проблема, что и при первоначальном получении, которая заключается в преобразовании из исходной кодировки в желаемую кодировку (надеюсь, используя точно такой же код), так что это не должно быть проблемой в отношении воспроизведения.

Другие советы

Как этот (по общему признанию, довольно старый) сообщение из списка рассылки указывает на то, что мало что известно о внутренней структуре этого сетевого протокола.Это может затруднить выполнение того, что вам нужно.

Тем не менее, если сообщения представляют собой просто двоичные блоки данных (захваченные из сети), у них даже не должно быть кодировки.Кодировки предназначены для текстовых данных, где это важно, поскольку один символ может быть закодирован множеством различных способов.Двоичные данные не состоят из символов, поэтому кодировки в этом смысле быть не может.

Вероятно, это связано с Java-строковой кодировкой, а не с TIBRV.Хотя это есть в документации:

Strings and Character Encodings 

--------------------------------------------------------------------------------

Rendezvous software uses strings in several roles: 

* String data inside message fields
* Field names
* Subject names (and other associated strings that are not
  strictly inside the message)
* Certified delivery correspondent names
* Group names (fault tolerance)

All these strings (both in C and in wire format) use the character
encoding appropriate to the ISO locale of the sender. For example,
the United States is locale en_US, and uses the Latin-1 character
encoding (also called ISO 8859-1); Japan is locale ja_JP, and uses
the Shift-JIS character encoding. 

When two programs exchange messages within the same locale, strings
are always correct. However, when a message sender and receiver use
different character encodings, the receiving program must convert
between encodings as needed. Rendezvous software does not convert
automatically. 

EBCDIC 
For information about string encoding in EBCDIC environments,
see tibrv_SetCodePages() . 

Поэтому вы, возможно, захотите посмотреть на локализацию машин.

Нужно ли мне знать, в какой кодировке кодируются байты сообщения TIBRV, чтобы выполнить преобразование?

ДА.Кодировка - это метод преобразования текста в поток байтов и наоборот.Ваши сетевые данные представляют собой поток байтов, поэтому, когда вы интерпретируете их части как текст, вы (неявно или явно) используете кодировку - вопрос в том, правильная ли она.

Преобразование байтов из одной кодировки в другую в основном означает преобразование их в текст с использованием одной кодировки, а затем обратно в байты с использованием другой.Обратите внимание, что это может привести к изменению длины данных, поскольку многие кодировки используют более 1 байта для некоторых символов.В контексте сетевых сообщений это может быть проблематично, когда делает недействительными поля длины или приводит к переполнению текстовых полей.Вероятно, лучше не проводить никаких преобразований и вместо этого научить приложение для чтения тому, как работать с различными кодировками.

Если да, то как я могу это выяснить?

Посмотрите на спецификацию протокола.

Прочитайте все, что содержит байт[] из InputStream, запишите байт[] в FileOutputStream.

НЕ следует привлекать Читателя или Писателя, они выполняют преобразование символов, а это неправильно.

Держитесь подальше от java.nio, пока не поймете java.io .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top