2012-10-16 33 views
7

我們正在使用外部服務來獲取CSV格式的數據。我們正在嘗試將數據寫入響應,以便可以將csv下載到客戶端。不幸的是,我們正在以下面的格式獲取數據。在java中解碼編碼的英鎊符號

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

我們無法解碼內容。有沒有辦法在java中解碼£並顯示£

是否有可用於解碼字符串的String Utils。

回答

2

問題: 當我們使用了字符串的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"); 
+0

同樣,短,與標準的API:'含量= CSVContent.getBytes( 「ISO-8859-1」);' – Joni

+0

@Joni這確實是我的問題最好的解決方案。謝謝。 –

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變爲亂碼的字符串,並且不能修復它的閱讀方式,重新編碼的一種方式是由字符串轉換回字節,重新演繹字節爲UTF-8。此過程不需要任何外部「StringUtils」或編解碼器庫; Java標準API足夠強大:

String input = ...obtain from somewhere...; 
String output = new String(input.getBytes(/*use platform default*/), "UTF-8"); 
+0

我試圖讀取本地計算機的文件,效果不錯。但是從應用程序中解碼不正確。 –

+0

@AnilKumarC你的意思是什麼應用程序?可能對此應用程序的輸入的編碼被破壞。 – 2012-10-16 07:17:27

+0

@AnilKumarC如果讀取文件時未指定字符編碼,則使用*默認編碼*。默認編碼取決於您運行程序的機器,因此您可以期望在不同系統上看到不同的結果。 – Joni

1

我們很幸運現在擁有Java 7。你可以做PathsFilesStandardCharsets如下:

Path path = Paths.get("/tmp", "input.txt"); 
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8); 
for (String line : lines) { 
    System.out.println(line); 
}