8

外部サービスを使用して、CSV形式でデータを取得しています。csvをクライアントにダウンロードできるように、応答にデータを書き込もうとしています。残念ながら、以下の形式でデータを取得しています。

Amount inc. VAT      Balance
£112.83             £0.0
£97.55              £0.0
£15.28              £0.0

コンテンツをデコードできません。Javaでデコード£して表示する方法はありますか?£

文字列をデコードするために利用できるStringUtilsはありますか?

4

3 に答える 3

5

ファイルはUTF-8でエンコードされているようです。UTF-8として読む必要があります。

と会社を使用している場合はjava.io.FileReader、を開いて代わりにFileInputStream使用する必要があります。InputStreamReader

// Before: Reader in = new FileReader(file)
Reader in = new InputStreamReader(new FileInputStream(file), "UTF-8");

ファイルを読み取るために他の方法(おそらく外部または内部のクラスライブラリ?)を使用している場合は、ファイルの読み取りに使用されるテキストエンコーディングを指定できるかどうか、ドキュメントを確認してください。

更新:すでに文字化けのような文字列があり£97.55、その読み取り方法を修正できない場合、再コーディングの1つの方法は、文字列をバイトに変換し直し、バイトをUTF-8として再解釈することです。このプロセスには、外部の「StringUtils」またはコーデックライブラリは必要ありません。Java標準APIは十分に強力です。

String input = ...obtain from somewhere...;
String output = new String(input.getBytes(/*use platform default*/), "UTF-8");
于 2012-10-16T07:03:11.280 に答える
2

問題: 文字列に対してgetBytes()を使用すると、デフォルトのエンコーダーを使用してデコードしようとします。文字列がエンコードされると、デフォルトのデコーダーを使用すると、デコードがうまく機能しない場合があります。

解決策: apacheの1つのStringUtilsは、応答に書き戻すときにこれらの文字をデコードするのに役立ちます。このクラスはorg.apache.commons.codec.binaryパッケージで利用できます。

String CSVContent = "/* CSV data */";
/**
 *  Decode the bytes using UTF8.  
 */
String decodedStr = StringUtils.newStringUtf8(CSVContent.getBytes("UTF-8"));
/**
 *  Convert the decoded string to Byte array to write to the stream  
 */
Byte [] content = StringUtils.getBytesIso8859_1(decodedStr);

Maven2.0の依存関係。

<dependency>
     <groupId>commons-codec</groupId>
     <artifactId>commons-codec</artifactId>
     <version>1.6</version>
</dependency>

解決策:2つ

@Joniによると、標準APIを使用したより優れたソリューション:

content = CSVContent.getBytes("ISO-8859-1");
于 2012-10-16T09:05:13.230 に答える
1

今Java7を持っているのは幸運です。Paths、、、FilesおよびStandardCharsets:を使用して次の操作を実行できます。

Path path = Paths.get("/tmp", "input.txt");
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
for (String line : lines) {
    System.out.println(line);
}
于 2012-10-16T07:14:01.350 に答える