2011-09-02 24 views
9

我需要一個ISO-8859-1文件轉換爲UTF-8編碼,沒有鬆動的內容intormations ...轉換ISO-8859-1到UTF-8使用Groovy

我有一個文件,它看起來像這個:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<HelloEncodingWorld>Üöäüßßß Test!!!</HelloEncodingWorld> 

不是我想編碼成UTF-8。 我試過以下:

f=new File('c:/temp/myiso88591.xml').getText('ISO-8859-1') 
ts=new String(f.getBytes("UTF-8"), "UTF-8") 
g=new File('c:/temp/myutf8.xml').write(ts) 

沒有工作,因爲字符串不兼容。 然後我讀一些有關bytestreamreaders /作家/ streamingmarkupbuilder等...

那我就

f=new File('c:/temp/myiso88591.xml').getText('ISO-8859-1') 
mb = new groovy.xml.StreamingMarkupBuilder() 
mb.encoding = "UTF-8" 

new OutputStreamWriter(new FileOutputStream('c:/temp/myutf8.xml'),'utf-8') << mb.bind { 
    mkp.xmlDeclaration() 
    out << f 
} 

這是完全不正是我想要的..

我只是想獲得用ISO-8859-1讀取器讀取一個xml的內容,然後將其放入一個新的(舊)文件...爲什麼這是如此複雜: -/

結果應該是,文件應該是真的用utf-8編碼:

<?xml version="1.0" encoding="UTF-8" ?> 
<HelloEncodingWorld>Üöäüßßß Test!!!</HelloEncodingWorld> 

感謝您的任何答案 乾杯

+1

我還沒有得到關於Groovy的第一個想法,但我認爲如果你指定'File.getText'文件的編碼,它將從轉換即自動編碼到您的內部編碼。即只要您的內部編碼設置爲使用UTF-8,您可能不需要執行其他任何操作。有人糾正我,如果我在這裏偏離軌道。或者,您得到的確切錯誤是什麼? – deceze

回答

12
def f=new File('c:/data/myiso88591.xml').getText('ISO-8859-1') 
new File('c:/data/myutf8.xml').write(f,'utf-8') 

(我只是給它一個嘗試,它工作:-)

相同的java:庫爲你做轉換。 as deceze說:當你指定一個編碼時,它將被轉換爲內部格式(utf-16 afaik)。當您在編寫字符串時指定另一種編碼時,它將被轉換爲此編碼。

但如果你使用XML,你不應該擔心編碼無論如何,因爲XML解析器會照顧它。它會讀取第一個字符<?xml並確定這些字符的基本編碼。之後,它可以從你的XML頭中讀取編碼信息並使用它。

+1

'<?xml'?這在UTF-8和ASCII等方面是不是一樣? :) – bzlm

+0

某些UTF編碼使用BOM開始文件。而在ebcdic等編碼中,'<?xml'字符並不相同。有關詳細信息,請參見http://www.w3.org/TR/xml/#sec-guessing。這是非常有趣的,也是一個很好的理由,不要爲了猜測編碼而創建自己的代碼。 – rdmueller

+2

對不起,但它是不正確的,它真的有效。它是這樣存儲的: '<?xml version =「1.0」encoding =「ISO-8859-1」?> ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃ「這是顯示仍然ISO-8859-1(使用記事本+ + +)也許第一行迫使編輯顯示爲...啊好吧,這是這種情況下,omg,我已經這麼頻繁地嘗試這種方式......但從來沒有意識到數據是用utf 8編碼的,但是顯示爲ansi ...非常感謝。 – Booyeoo

8

製作多一點的Groovy,並且不需要整個文件,以適應在內存中,可以使用的讀者和作家流的文件。這是我的解決方案,當我的文件太大時,對於普通的舊版Unix iconv(1)

new FileOutputStream('out.txt').withWriter('UTF-8') { writer -> 
    new FileInputStream('in.txt').withReader('ISO-8859-1') { reader -> 
     writer << reader 
    } 
} 
+0

非常groovy解決方案。我喜歡你使用withReader/Writer的方式。我自己試了一下,效果很好:) –