2011-09-02 21 views
9

tôi cần phải chuyển đổi một tập tin ISO-8859-1 sang UTF-8 mã hóa, mà không mất intormations nội dung ...Chuyển đổi ISO-8859-1 sang UTF-8 sử dụng groovy

tôi có một tập tin mà trông giống như này:

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

Tôi không muốn mã hóa nó thành UTF-8. Tôi đã thử theo dõi:

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) 

không hoạt động do Chuỗi không tương thích. Sau đó, tôi đọc một cái gì đó về bytestreamreaders/nhà văn/streamingmarkupbuilder và khác ...

sau đó tôi đã cố gắng

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 
} 

này là hoàn toàn không phải là những gì tôi muốn ..

Tôi chỉ muốn nhận được nội dung của một lần đọc xml với trình đọc ISO-8859-1 và sau đó đặt nó vào một tệp (cũ) mới ... tại sao điều này phức tạp như vậy: -/

Kết quả phải là, và tệp phải là thực sự được mã hóa trong utf-8:

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

Thanks cho bất kỳ câu trả lời Cheers

+1

tôi đã không có ý tưởng đầu tiên về Groovy, nhưng tôi cho rằng nếu bạn chỉ định mã hóa của file cho 'File.getText', nó sẽ được chuyển đổi từ mã hóa tự động mã hóa nội bộ của bạn. I E. bạn có thể không cần phải làm bất cứ điều gì khác miễn là mã hóa nội bộ của bạn được thiết lập để sử dụng UTF-8. Ai đó sửa tôi nếu tôi không theo dõi ở đây. Ngoài ra, các lỗi chính xác bạn nhận được là gì? – deceze

Trả lời

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

(Tôi chỉ cho nó một thử, nó hoạt động :-)

giống như trong java: các thư viện làm việc chuyển đổi cho bạn. .. như lừa dối cho biết: khi bạn chỉ định mã hóa, nó sẽ được chuyển thành định dạng nội bộ (utf-16 afaik). Khi bạn chỉ định một mã hóa khác khi bạn viết chuỗi, nó sẽ được chuyển đổi sang mã hóa này.

Nhưng nếu bạn làm việc với XML, bạn không phải lo lắng về việc mã hóa vì trình phân tích cú pháp XML sẽ xử lý nó. Nó sẽ đọc các ký tự đầu tiên <?xml và xác định mã hóa cơ bản từ các ký tự đó. Sau đó, nó có thể đọc thông tin mã hóa từ tiêu đề xml của bạn và sử dụng nó.

+1

' bzlm

+0

Một số mã hóa UTF bắt đầu tệp bằng BOM. Và trong một số mã hóa như ebcdic, các ký tự ' rdmueller

+2

Xin lỗi nhưng nó không đúng, nó thực sự hoạt động. Nó được lưu trữ như thế này: ' ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃ !!!' và mã hóa được hiển thị vẫn là ISO-8859-1 (sử dụng notepad ++) Có lẽ dòng đầu tiên buộc trình chỉnh sửa hiển thị nó là ... à, đây là trường hợp đó, omg, tôi đã thử cách này thường xuyên .... nhưng chưa bao giờ nhận ra rằng dữ liệu được mã hóa trong utf 8 nhưng được hiển thị như ansi ... cảm ơn rất nhiều. – Booyeoo

8

Làm cho nó nhiều hơn một chút Groovy, và không yêu cầu toàn bộ tập tin để phù hợp với bộ nhớ, bạn có thể sử dụng các độc giả và nhà văn để truyền tệp. Đây là giải pháp của tôi khi tôi có các tệp quá lớn đối với Unix cũ là iconv(1).

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

Giải pháp rất hấp dẫn. Tôi thích cách bạn sử dụng withReader/Writer. Tôi đã thử nó ra bản thân mình và nó làm việc tuyệt vời :) –

Các vấn đề liên quan