我們正在使用外部服務來獲取CSV格式的數據。我們正在嘗試將數據寫入響應,以便可以將csv下載到客戶端。不幸的是,我們正在以下面的格式獲取數據。在java中解碼編碼的英鎊符號
Amount inc. VAT Balance
£112.83 £0.0
£97.55 £0.0
£15.28 £0.0
我們無法解碼內容。有沒有辦法在java中解碼£
並顯示£
。
是否有可用於解碼字符串的String Utils。
我們正在使用外部服務來獲取CSV格式的數據。我們正在嘗試將數據寫入響應,以便可以將csv下載到客戶端。不幸的是,我們正在以下面的格式獲取數據。在java中解碼編碼的英鎊符號
Amount inc. VAT Balance
£112.83 £0.0
£97.55 £0.0
£15.28 £0.0
我們無法解碼內容。有沒有辦法在java中解碼£
並顯示£
。
是否有可用於解碼字符串的String Utils。
問題: 當我們使用了字符串的getBytes(),它會嘗試使用默認的編碼進行解碼。一旦字符串被編碼,如果我們使用默認解碼器,解碼可能無法正常工作。
解決方案:一個 apache的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);
Maven 2.0依賴。
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.6</version>
</dependency>
解決方案:兩個
按照@Joni,與標準API更好的解決方案:
content = CSVContent.getBytes("ISO-8859-1");
該文件似乎用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
變爲亂碼的字符串,並且不能修復它的閱讀方式,重新編碼的一種方式是由字符串轉換回字節,重新演繹字節爲UTF-8。此過程不需要任何外部「StringUtils」或編解碼器庫; Java標準API足夠強大:
String input = ...obtain from somewhere...;
String output = new String(input.getBytes(/*use platform default*/), "UTF-8");
我試圖讀取本地計算機的文件,效果不錯。但是從應用程序中解碼不正確。 –
@AnilKumarC你的意思是什麼應用程序?可能對此應用程序的輸入的編碼被破壞。 – 2012-10-16 07:17:27
@AnilKumarC如果讀取文件時未指定字符編碼,則使用*默認編碼*。默認編碼取決於您運行程序的機器,因此您可以期望在不同系統上看到不同的結果。 – Joni
我們很幸運現在擁有Java 7。你可以做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);
}
同樣,短,與標準的API:'含量= CSVContent.getBytes( 「ISO-8859-1」);' – Joni
@Joni這確實是我的問題最好的解決方案。謝謝。 –