3

Windows 1252 コードページにあると思われる Java (元は Excel シートから) の文字列がいくつかあります。それらをJava独自のUnicode形式に変換してほしい。問題が発生した場合に備えて、ExcelファイルはJXLパッケージを使用して解析されました。

はっきりさせておきますが、明らかに、Excel ファイルから取得した文字列は、すでにある種の Unicode であるかのように見えます。

WorkbookSettings ws = new WorkbookSettings();
ws.setCharacterSet(someInteger);
Workbook workbook = Workbook.getWorkbook(new File(filename), ws);
Sheet s = workbook.getSheet(sheet); 
row = s.getRow(4);
String contents = row[0].getContents();

これは、コンテンツに何か Unicode が含まれているように見える場所です。 åäö はマルチバイト文字ですが、ASCII は通常のシングルバイト文字です。これは間違いなく Latin1 ではありません。printLn を使用して「contents」文字列を出力し、hello.txt ファイルにリダイレクトすると、文字「ö」が 2 バイト (16 進数では C3 B6) で表されていることがわかります。(10 進数で 195 と 179。)

[編集]

以下に示すさまざまなコードページなどで提案を試み、Cp1252などから変換しようとしました。代わりに他の種類の意味不明なものが得られるため、何らかの変換がありました。参照として、端末や書体などに問題がないことを確認するために、ソースコードに手動でコード化された「ö」文字列を常に出力しました。手動で入力した「ö」は常に機能しました。

[編集]

コメントで提案されているように WorkBookSettings も試しましたが、JXL のコードを調べたところ、コードの解析によって characterSet が無視されるようです。解析コードは、XLS ファイルが想定されているエンコーディングを調べるだけだと思います。

4

7 に答える 7

5

WorkbookSettings ws = new WorkbookSettings();

ws.setEncoding("CP1250");

私のために働いた。

于 2009-04-21T15:02:09.823 に答える
2

上記の答えのどれも問題を解決しない場合、トリックは次のように行われる可能性があります。

String myOutput = new String (myInput, "UTF-8");

これにより、形式に関係なく、着信文字列がデコードされます。

于 2010-08-23T15:09:35.203 に答える
1

ファイルを解析するときに正しいエンコーディングを指定する必要があります。間違ったエンコーディングに基づいた Java String を取得してからでは手遅れです。

JXL ではWorkbookSettings、ファクトリ メソッドにオブジェクトを渡すことでエンコーディングを指定できます。

于 2009-02-24T10:58:24.123 に答える
1

Java がファイルを解析するとき、何らかのエンコーディングを使用してディスク上のバイトを読み取り、メモリ内にバイトを作成します。デフォルトのエンコーディングは、プラットフォームによって異なります。Java の内部文字列表現はすでに Unicode であるため、適切なエンコーディングでファイルを解析すれば、すでに完了しています。必要なエンコーディングでデータを書き出すだけです。

Java で文字列を表示したときに文字列が壊れているように見える場合は、データの読み取りに間違ったエンコーディングを使用している可能性があります。ExcelはおそらくUTF-16(リトルエンディアンだと思います)を使用していますが、JXLのようなライブラリがそれを適切に検出できるはずです。私は JXL の Javadoc を見てきましたが、文字エンコーディングでは何もしません。必要に応じてエンコーディングを自動検出すると思います。

すでに読み込まれている文字列をテキスト ファイルに書き込むだけでよいのでしょうか。その場合、次のようなものが機能します。

String text = getCP1252Text(); // doesn't matter what the original encoding was, Java always uses Unicode
FileOutputStream fos = new FileOutputStream("test.txt"); // Open file
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-16"); // Specify character encoding
PrintWriter pw = new PrintWriter(osw);

pw.print(text ); // repeat as needed

pw.close(); // cleanup
osw.close();
fos.close();

問題が他のものである場合は、質問を編集して詳細を提供してください。

于 2009-02-23T15:04:33.633 に答える
0

「windows-1252」/「Cp1252」はJREでサポートされている必要はありませんが、Sun(およびおそらく他のほとんど)でサポートされています。JDKドキュメントの「サポートされているエンコーディング」を参照してください。次に、バイトを文字にデコードするためにString、または同様の方法を使用するだけです。InputStreamReader

于 2009-02-23T14:55:35.933 に答える
0
FileInputStream fis = new FileInputStream (yourFile);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis,"CP1250"));

そして、ファイルで直接行うことは何でもリーダーで行います。

于 2009-02-23T15:14:17.337 に答える
0

あなたの説明は、エンコーディングがUTF-8であり、実際にC3 B6が「ö」のUTF-8エンコーディングであることを示しています。

于 2010-01-07T16:14:29.347 に答える