2011-12-16 14 views
1

ElasticSearch是一種搜索服務器,它只接受UTF8中的數據。從因特網獲得的文本的UTF8轉換

當我試圖給ElasticSearch以下文本

小企業可能在行較輕的報告負擔包括那些低於£44萬的年營業額,低於£220,000比減少淨資產十人」

通過我的Java應用程序 - 基本上我的Java應用程序需要從網頁此信息,並將其提供給elasticSearch ES抱怨它無法理解£和失敗下面的代碼過濾通過後 - 。

byte bytes[] = s.getBytes("ISO-8859-1"); 
s = new String(bytes, "UTF-8"); 

這裏£轉化爲

但是當我使用bash將其複製到文件中我的主目錄,並在去罰款。任何指針都會有幫助。

+3

http://xkcd.com/138/ –

+1

@VineethMohan( 「ISO-8859-1」)'?我以爲你需要使用UTF-8? – buruzaemon

+0

我需要識別基本編碼。我假定文本的編碼爲ISO-8859-1 –

回答

3

您有bytes中的ISO-8895-1八位位組,然後您告知String解碼,就好像它是UTF-8一樣。當它這樣做時,它不會識別非法0xA3序列並用替代字符替換它。

要做到這一點,你必須用它使用的編碼構造字符串,然後將其轉換爲你想要的編碼。見How do I convert between ISO-8859-1 and UTF-8 in Java?

0

UTF-8比人們想象的要容易。在字符串中,一切都是unicode字符。 字節/字符串轉換完成如下。 (注或的Cp1252 Windows的1252是ISO-8859-1的Windows的Latin1的擴展;更好地利用 那一個。)

BufferedReader in = new BufferedReader(
     new InputStreamReader(new FileInputStream(file), "Cp1252")); 
PrintWriter out = new PrintWriter(
     new OutputStreamWriter(new FileOutputStream(file), "UTF-8")); 
response.setContentType("text/html; charset=UTF-8"); 
response.setEncoding("UTF-8"); 
String s = "20 \u00A3"; // Escaping 

要知道爲什麼是的Cp1252比ISO-8859-1更適合: http://en.wikipedia.org/wiki/Windows-1252

-1

字符串s是一系列基本上獨立於任何字符編碼的字符(好吧,不完全獨立,但足夠接近我們現在的需要)。無論您將數據加載到字符串中時編碼的數據是否已被解碼。解碼是使用系統默認編碼(實際上總是一個錯誤,不要使用系統默認編碼,相信我,我有超過10年處理與錯誤默認編碼相關的錯誤的經驗)或您明確指定的編碼當你加載數據。

當您爲字符串調用getBytes(「ISO-8859-1」)時,請求根據ISO-8859-1編碼將字符串編碼爲字節。

當您從字節數組創建字符串時,需要指定表示字節數組中字符的編碼。你從已經用UTF-8編碼的字節數組中創建一個字符串(並且正好在你將其編碼在ISO-8859-1中,這是你的錯誤)。

你想要做的是:

byte bytes[] = s.getBytes("UTF-8"); 
s = new String(bytes, "UTF-8"); 
爲什麼你使用`的getBytes