1

入力属性の1つがStringxmlであるメソッドがあります。そのxmlをエンコードするためのコントロールを作成したいだけです。UTF-8以外のエンコーディングの文字がある場合、エラーがスローされます。

作成してテストする最も簡単な方法を教えてください。

私はこのようなものを使用しました:

String xml = IOUtils.toString(new FileInputStream("c:/encoding.xml")); 
Document doc = builder.parse(IOUtils.toInputStream(xml, "UTF-8"));

Ľ、Š、Ť、Ž、ľ、š、ť、žなどの文字を追加し、cp1250ファイルとして保存します。

しかし、エラーはありません。

私は何が間違っているのですか?

4

2 に答える 2

2

これは、Javaでネイティブに実行することはできません。ファイルは単なるバイトの文字列であり、どのように解釈してもかまいません。デフォルトでは、Javaには意味を追加する方法がありません。私はこのライブラリを使用することをお勧めします(私はそれを書きませんでした):

http://code.google.com/p/juniversalchardet/

次の手順に従ってください(そのリンクからコピーを貼り付けます)。

それの使い方

  1. のインスタンスを作成しorg.mozilla.universalchardet.UniversalDetectorます。
  2. を呼び出して、一部のデータ(通常は数千バイト)を検出器にフィードしますUniversalDetector.handleData()
  3. を呼び出して、データの終わりを検出器に通知しUniversalDetector.dataEnd()ます。
  4. を呼び出して、検出されたエンコーディング名を取得しUniversalDetector.getDetectedCharset()ます。
  5. UniversalDetector.reset()検出器インスタンスを再利用する前に、呼び出すことを忘れないでください。
于 2012-11-27T14:10:22.243 に答える
1
String xml = IOUtils.toString(new FileInputStream("c:/encoding.xml")); 

これIOUtilsがそうである場合org.apache.commons.io.IOUtils、そのJavadocは言う

「プラットフォームのデフォルトの文字エンコーディングを使用して、InputStream の内容を文字列として取得します。」

cp1250 として保存しているので、cp1250 はプラットフォームの文字エンコーディングでもあると思います。あなたのコードがやっていることは

  1. ファイルをバイトストリームとして読み取る
  2. cp1250 (プラットフォーム エンコーディング) を使用してバイト ストリームを文字に変換します。
  3. 文字を Java 内部表現 (UTF-16) に変換します。
  4. UTF-16 から UTF-8 への変換
  5. XML ドキュメントの作成

cp1250は実際にはファイル エンコーディングであるため、常に機能します。UTF-16 には cp1250 のすべての文字があり、UTF-8 には UTF-16 のすべての文字があります。

バイトを UTF-8 として読み取り、自動変換を回避する場合は、次の 2 つのパラメーターのバリアントのいずれかを使用する必要がありますIOUtils.toString()

public static String toString(InputStream input, Charset encoding)

public static String toString(InputStream input, String encoding)

だから私は試してみます:

// Helper import: I always forget if the constant is "UTF8" or "UTF-8"
import org.apache.commons.lang.CharEncoding;

String xml = IOUtils.toString(new FileInputStream("c:/encoding.xml"), CharEncoding.UTF_8); 
Document doc = builder.parse(IOUtils.toInputStream(xml, CharEncoding.UTF_8));

ここでの経験則は次のとおりです。ソース/宛先エンコーディングを指定せずに、バイトから文字列へ/文字列からバイトへの変換を絶対に行わないでください

ちょっとした経験則は次のとおりです。他のエンコーディングを使用する必要がない限り、どこでも UTF-8 を使用してください。

これらの経験則はどちらも、選択したプログラミング言語とは無関係です。

于 2012-11-27T15:06:04.497 に答える