1

私の Java アプリケーションでは、TIBCO RV メッセージをバイトとしてファイルにアーカイブしています。

メッセージを再生する小さなユーティリティ アプリを作成しています。このようにして、ファイルを解析してオブジェクトを手動で構築することなく、バイトから TibrvMsg オブジェクトを作成することができます。

私が抱えている問題は、Linux ボックスで作成されたファイルを読み取っていて、Windows マシンでアプリを実行しようとしていることです。ファイルが書き込まれた文字セットが異なるため、エラーが発生します。

今、私がやりたいことは、各メッセージを特定の文字セット (UTF-8) でログに記録することです。これにより、再生アプリを実行するプラットフォームを気にしなくなります。アプリは、事前に知っているファイルを読み込むだけです。ファイルが書き込まれる文字セット。バイトをある文字セットから別の文字セットに変換するために、これに java.nio パッケージを使用することを計画しています。

変換を行うために、TIBRV メッセージのバイトがエンコードされている文字セットを知る必要がありますか? もしそうなら、どうすればこれを見つけることができますか?

4

5 に答える 5

3

不透明(OPAQUE)データを取得していて、テキスト以外の部分をエスケープせずにテキストデータとしてファイルに書き込もうとしているように見えます(または、生のバイトとして書き込んでから、文字ベースであるかのように読み取ろうとしています)。これはほとんど同じ問題です)。これは最初から欠陥があります。

不透明(OPAQUE)データは無意味なものとして扱われ、その処理方法を知っているAPIに返すために、変更せずに単純に保存する必要があります。データをテキスト形式で保存する必要がある場合は、バイトをロスレスでテキストに変換する必要があります。適切なエンコーディングはbase64のようなものです。文字セットエンコーディングの意味でのエンコーディングは、生のバイナリデータに適用すればロスレスではありません。

メッセージの長さとメッセージが送信された件名を示す固定長のプレフィックスとともに、バイトをバイト(文字ではなく)としてファイルに格納するだけで、システム全体でRVメッセージを再生できます。

メッセージ内のテキストベースのフィールドに関連して、エンコーディングが重要な場合(アプリを設計するときに一般的にこの問題を回避することを強くお勧めします)、変換する元の受信時に発生したのと同じ問題が再生時に発生しますソースエンコーディングから目的のエンコーディングへ(うまくいけばまったく同じコードを使用して)、これは再生に関しては問題にならないはずです。

于 2009-05-26T17:04:44.913 に答える
1

この (確かにかなり古い)メーリング リスト メッセージが示すように、そのネットワーク プロトコルの内部構造についてはほとんどわかっていません。これは、あなたが求めていることをするのがかなり難しいかもしれません.

とはいえ、メッセージが (ネットワークからキャプチャされた) データの単なるバイナリ ブロックである場合は、文字セットさえ持つべきではありません。Charsets はテキスト データ用であり、単一の文字をさまざまな方法でエンコードできるため重要です。バイナリデータは文字で構成されていないため、その意味でのエンコーディングはありません。

于 2009-05-26T15:28:10.020 に答える
1

これはおそらく、TIBRV ではなく、Java 文字列エンコーディングに関連しています。ドキュメントにはこれがありますが:

文字列と文字エンコーディング

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

Rendezvous ソフトウェアは、いくつかの役割で文字列を使用します。

* メッセージ フィールド内の文字列データ
* フィールド名
* サブジェクト名 (およびその他の関連付けられた文字列ではない
  厳密にはメッセージ内)
※認定配達員名
* グループ名 (耐障害性)

これらすべての文字列 (C とワイヤ形式の両方) は、文字を使用します
送信者の ISO ロケールに適したエンコーディング。例えば、
米国はロケール en_US で、Latin-1 文字を使用します
エンコーディング (ISO 8859-1 とも呼ばれます); 日本はロケールja_JPで、
Shift-JIS 文字エンコーディング。

2 つのプログラムが同じロケール内でメッセージを交換する場合、文字列
常に正しいです。ただし、メッセージの送信者と受信者が使用する場合
異なる文字エンコーディングの場合、受信プログラムは変換する必要があります
必要に応じてエンコード間。Rendezvous ソフトウェアが変換しない
自動的。

EBCDIC
EBCDIC 環境での文字列エンコーディングについては、
tibrv_SetCodePages() を参照してください。

そのため、マシンのロケールを見たいと思うかもしれません。

于 2009-05-26T15:30:32.327 に答える
0

変換を行うために、TIBRV メッセージのバイトがエンコードされている文字セットを知る必要がありますか?

はい。文字セットは、テキストをバイト ストリームに、またはその逆に変換する方法です。ネットワーク データはバイト ストリームであるため、その一部をテキストとして解釈する場合、(暗黙的または明示的に) 文字セットを使用しています。問題は、それが正しいものかどうかです。

ある文字セットから別の文字セットにバイトを変換することは、基本的に、ある文字セットを使用してバイトをテキストに変換し、別の文字セットを使用してバイトに戻すことを意味します。多くの文字セットは一部の文字に 1 バイト以上を使用するため、これによりデータの長さが変化する可能性があることに注意してください。ネットワーク メッセージのコンテキストでは、長さフィールドが無効になったり、テキスト フィールドがオーバーフローしたりすると、これが問題になる可能性があります。おそらく、変換を行わずに、さまざまな文字セットを処理する方法を学習するように読み取りアプリに教える方がよいでしょう。

もしそうなら、どうすればこれを見つけることができますか?

プロトコル仕様を見てください。

于 2009-05-26T15:46:36.473 に答える
0

inputStream から byte[] 内のすべてを読み取り、byte[] を FileOutputStream に書き込みます。

いいえリーダーまたはライターが関与する必要はありません。彼らは文字変換を行いますが、それは間違っています。

java.io を理解するまで、java.nio には近づかないでください。

于 2009-05-26T18:45:57.563 に答える