Как я могу найти байтовую кодировку сообщения TIBCO Rendezvous? - PullRequest
1 голос
/ 26 мая 2009

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

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

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

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

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

Ответы [ 5 ]

3 голосов
/ 26 мая 2009

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

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

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

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

1 голос
/ 26 мая 2009

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

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

0 голосов
/ 26 мая 2009

Чтение всего intete byte [] из inputStream, запись байта [] в FileOutputStream.

НИКАКОЙ читатель или писатель не должен быть вовлечен, они выполняют преобразование символов, и это неправильно.

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

0 голосов
/ 26 мая 2009

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

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

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

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

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

0 голосов
/ 26 мая 2009

Это, вероятно, связано с кодированием строки 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() . 

Так что вы можете посмотреть на локали машин.

...