私のアプリケーションはurlconnectionからxmlを読み取ります。xmlエンコーディングはISO-8859-1であり、é文字が含まれています。xerces saxparserを使用して、受信したxmlコンテンツを解析します。ただし、lunix OSでアプリケーションを実行している間は、éを正しく解析できません。Windowsではすべてが正常に機能します。ヒントを教えていただけませんか?どうもありがとう
5 に答える
これはおそらく、実際には別のエンコーディングであるのに、「ISO-8859-1」としてマークされたファイルの場合です。
多くの場合、これは "ISO-8859-1" と "Windows-2152" で発生します: これらは交換可能であるかのように使用されていますが、そうではありません。(この回答へのコメントでは、両方のエンコーディングが「é」の文字コードに同意することが明らかにされているため、Windows-1252 はおそらくそうではありません。)
16 進エディタを使用して、ファイル内の「é」の正確な文字コードを見つけることができます。その値を、ファイルのエンコーディングのヒントとして利用できます。ファイルの生成方法を制御できる場合は、責任のあるコード/メソッドを確認することもお勧めします。
これはfile.encodingに関連しているに違いありません。LinuxでVMパラメーターとして-Dfile.encoding=iso-8859-1を使用して実行してみてください。
これが機能する場合は、ストリームを開くときに(コードのどこかで)正しい形式を指定する必要があります。
最初に行うべきことは、Tomalak が示唆するように、ヘッダーに記載されているエンコーディングではなく、xml ファイルの実際のエンコーディングを決定することです。
Internet Explorerで開くことから始めることができます。エンコーディングが正しくない場合、次のようなエラーが表示されることがあります。
テキスト コンテンツに無効な文字が見つかりました。リソースの処理中にエラーが発生しました...
または次のもの:
現在のエンコーディングから指定されたエンコーディングへの切り替えはサポートされていません。リソースの処理中にエラーが発生しました...
次のステップでは、複数のエンコーディングをサポートするテキスト エディターを使用します。無料で使いやすく、複数のエンコーディングをサポートするNotepad++を使用できます。エンコードに関する xml ヘッダーの内容に関係なく、エディターはファイルのエンコードを検出してステータス バーに表示しようとします。
ファイルのエンコーディングが正しいと判断した場合は、Java 内でエンコーディングを正しく処理していない可能性があります。Java 文字列は UTF-16 であり、デフォルトでバイト配列との間で変換する場合、エンコーディングが指定されていない場合、Java はデフォルトでシステム エンコーディング (Windows では Windows-1521、最新の Linux では UTF-8) になることを考慮してください。一部のエンコーディング変換では、固定の 8 ビット エンコーディング (つまり、Windows-1252 <-> ISO-8859-1) 間の変換など、「奇妙な」文字のみが表示されます。他の変換では、無効な文字が原因でエンコンディング例外が発生します (たとえば、Windows-1252 テキストを UTF-8 としてインポートしてみてください)。
無効なコードの例は次のとおりです。
// Parse the input
SAXParser saxParser = factory.newSAXParser();
InputStream is = new ByteArrayInputStream(stringToParse.getBytes());
saxParser.parse( is, handler );
変換stringToParse.getBytes()
は、デフォルトで、Windows プラットフォームで Windows-1252 としてエンコードされた文字列を返します。このステップで XML テキストが ISO-8859-1 でエンコードされていた場合、文字が間違っています。正しい手順は、XML を文字列ではなくバイトとして読み取り、SAX で xml エンコーディングを管理できるようにすることです。
XML宣言でエンコーディングが指定されていない場合、saxパーサーはデフォルトのエンコーディングであるUTF-8を使用しようとします。
文字エンコードはわかっているが、XML宣言で指定されていない場合は、そのエンコードをInputSourceで使用するようにパーサーに指示できます。
InputSource inputSource = new InputSource(xmlInputStream);
inputSource.setEncoding("ISO-8859-1");
私の返事が遅れて申し訳ありません。問題を解決しました。入力ストリームで間違った操作を行いました (Fernando Miguelez が言ったように、変換で問題が発生しました)。
皆さんの助けに感謝します。