2012-11-22 57 views
12

我試圖將ISO 8859-1編碼的字符串轉換爲UTF-8。golang將iso8859-1轉換爲utf8

下面的函數與我的testdata包含德語元音變音,但我不太確定符文(b)演員假定的編碼來源。它是否採用了某種默認編碼方式,例如ISO8859-1還是有什麼辦法來告訴它使用什麼編碼?

func toUtf8(iso8859_1_buf []byte) string { 
    var buf = bytes.NewBuffer(make([]byte, len(iso8859_1_buf)*4)) 
    for _, b := range(iso8859_1_buf) { 
     r := rune(b) 
     buf.WriteRune(r) 
    } 
    return string(buf.Bytes()) 
} 
+1

順便說一句,你的意思是iso8859-1,對吧? – ANisus

+0

是的,抱歉,我已經編輯過它。 – zeroc8

回答

12

INT32的別名,當涉及到編碼,假設符文具有Unicode字符值(代碼點)。因此rune(b)中的值b應該是unicode值。對於0x00 - 0xFF,這個值與拉丁-1相同,所以你不必擔心它。

然後,您需要將符文編碼爲UTF8。但是這種編碼僅僅通過將[]rune轉換成string來完成。

這是您的功能的一個例子,而不使用字節包:

func toUtf8(iso8859_1_buf []byte) string { 
    buf := make([]rune, len(iso8859_1_buf)) 
    for i, b := range iso8859_1_buf { 
     buf[i] = rune(b) 
    } 
    return string(buf) 
} 
+0

我以爲只有值爲0x7f的值纔是相同的,謝謝指出。 – zeroc8

+2

Unicode和Latin-1中的值是相同的(Latin-1可以被認爲是Unicode的0x00-0xFF子集)。但是,當您存儲該值時,Latin-1僅使用1個字節(例如'0x41'),而Unicode使用4個字節(例如'0x00000041')。可能會混淆的是UTF-8編碼,其中只有0x00 - 0x7F使用單個字節以與Latin-1相同的方式進行編碼。 – ANisus

+0

UTF-8碼點不存在。你的意思是UTF-8編碼單元嗎? – 2014-08-09 08:05:12

2

r := rune(expression) 

的效果是:

  • 聲明變量r類型rune(別名對於int32)。
  • 用expresion的值初始化變量r

不涉及(重新)編碼,並且只有通過顯式編寫/處理代碼中的某些重新編碼纔可能選擇使用哪一個。幸運的是,在這種情況下,不需要(重新)編碼,Unicode以類似於ASCII的方式將ISO 8859-1的代碼合併到一起。 (如果我檢查正確here

+0

需要重新編碼。像ö這樣的字母不以相同的方式編碼。如果您有字節字符串'latin1 = [] byte {0x52,0xE4,0x76}',它將不會很好地轉換爲字符串。 (它說,* RAV *拉美-1) – ANisus

+2

但0xE4真的是ISO 8859-1'了','不O':http://en.wikipedia.org/wiki/ISO/IEC_8859-1#Codepage_layout。點擊此處查看:http://play.golang.org/p/s4TfzJUa7m – zzzz

+0

嗯,我想我誤解了。誠然,Latin-1和Unicode之間不需要重新編碼。是的,字節序列說Räv – ANisus