1

Jenaでいくつかの RDF ファイルを生成しています。アプリケーション全体が utf-8 テキストで動作します。ソースコードもutf-8で保存されています。

英語以外の文字を含む文字列をコンソールに出力すると、正しい形式が得られますEst un lieu généralement officielle assis...

次に、RDF ライターを使用してファイルを出力します。

Model m = loadMyModelWithMultipleLanguages()
log.info( getSomeStringFromModel(m) ) // log4j, correct output
RDFWriter w = m.getWriter( "RDF/XML" ) // default enc: utf-8
w.setProperty("showXmlDeclaration","true") // optional  
OutputStream out = new FileOutputStream(pathToFile)
w.write( m, out, "http://someurl.org/base/" )
// file contains garbled text

RDF ファイルは次で始まります: <?xml version="1.0"?>. utf-8 を追加しても何も変わりません。

デフォルトでは、テキストは utf-8 にエンコードされます。生成された RDF ファイルは正常に検証されますが、任意のエディター/ビジュアライザー (vim、Firefox など) で開くと、英語以外のテキストがすべて台無しになります:Est un lieu g√©n√©ralement officielle assis ...またはEst un lieu g\u221A\u00A9n\u221A\u00A9ralement officielle assis.... (いずれにせよ、これはユーザーの観点からは明らかに受け入れられません)。Jena がサポートする出力形式 (RDF、NT など) でも同じ問題が発生します。

これに対する論理的な説明は本当に見つかりません。公式ドキュメントはこの問題に対処していないようです。

それを理解するために実行できるヒントやテストはありますか?

4

3 に答える 3

1

私の推測では、文字列が台無しになっていて、printStringFromModel()メソッドが誤って正しく表示されるようにそれらを出力するだけですが、それ以上の情報がないと言うのはかなり難しいです.

RDF/XML ファイルに XML 宣言を含めるように Jena に指示していますが、Jena が XML 宣言で宣言しているエンコーディング (もしあれば) は指定しません。これは知っておくと役に立ちます。

また、メソッドで文字列を印刷する方法も示していませんprintStringFromModel()

また、Firefox では、[表示] メニューから [文字エンコード] に移動します。どのエンコーディングが選択されていますか? UTF-8 でない場合、UTF-8 を選択するとどうなりますか? 他のエンコーディングを選択すると、正しく表示されますか?

編集:投稿に表示するスニペットは問題なく動作するはずです。私の推測では、ソース文字列を Jena モデルに読み込むコードが壊れており、UTF-8 ソースを ISO-8859-1 または類似のものとして読み込みます。length()問題のある文字列のいずれかをチェックすることで、それを確認または不確認にすることができるはずéです。正しく 1 つとしてカウントされている場合は、書き込み中です。

于 2012-10-01T19:50:20.590 に答える
1

私のヒント/答えは、3 つの場所でバイト シーケンスを検査することです。

  1. データ ソース。16 進エディタを使用して、ソース データの é 文字が予期される utf-8 16 進シーケンス 0xc3a8 で表されていることを確認します。
  2. 記憶に。printStringFromModel への呼び出しの直後に、ブレークポイントを配置し、文字列内のバイトを調べます (または16 進数に変換して出力します .
  3. 出力ファイル。ここでも、16 進エディタを使用して、バイト シーケンスが 0xc3a8 であることを確認します。

これにより、バイトがプログラムのパスに沿って移動するときにバイトに何が起こっているか、また予想される 0xc3a8 から逸脱した場所が正確にわかります。

于 2012-10-01T19:52:27.657 に答える
1

これに対処する最善の方法は、問題を示すことができるコードの最小単位をパッケージ化し、完全で実行可能なテスト ケースをJena Jiraのチケットとして送信することです。

于 2012-10-01T21:33:56.293 に答える