這是我使用的 UCS-2 編碼的示例字符串:abvgd?e?zijklmnjoprst?uvhc?d??1234567890*+;'使用 iconv 二進制文件將 UCS-2 轉換為 iso ISO-8859-1//TRANSLIT 時,我得到:abvgd?ezzijklmnjoprstcuvhccdzs1234567890*+;'現在我想在 go 項目中使用 libiconv。我正在使用這個庫 github.com/qiniu/iconv 作為 libiconv 的綁定。但是當使用綁定時,我得到:abvgd?e?zijklmnjoprst?uvhc?d??1234567890*+;'就像在 go 中使用 library 時應用不同的音譯規則一樣。我檢查了 go bindings 庫,一切似乎都井井有條;只傳遞字節,因此不會發生“信息丟失”。使用 libiconv 時還有什么我應該注意的嗎?是否有一些環境上下文可以觸發不同的音譯行為?編輯(關于調用的附加說明):我有兩個文件“ucs-2.txt”和“latin1.txt”。ucs-2.txt 文件包含 UCS-2 編碼的字符串,latin1.txt 包含通過運行得到的字符串:iconv -f UCS2 -t ISO-8859-1//TRANSLIT --verbose data/encoding/ucs-2.txt > data/encoding/latin1.txt在 go 中,我使用這些行從這些文件中提取內容:var err errorucs2, err = ioutil.ReadFile("data/encoding/ucs-2.txt")if err != nil { log.Fatal(err)}latin1, err = ioutil.ReadFile("data/encoding/latin1.txt")if err != nil { log.Fatal(err)}這個函數正在做轉換:func convertEnc(content []byte) ([]byte, error) { cd, err := iconv.Open("ISO-8859-1//TRANSLIT", "UCS2") if err != nil { return nil, err } defer cd.Close() var outbuf [255]byte res, _, err := cd.Conv(content, outbuf[:]) log.Printf("result: %+q", res) return res, err}我正在使用 DeepEqual 進行測試:reflect.DeepEqual(res, latin1)
2 回答

智慧大石
TA貢獻1946條經驗 獲得超3個贊
第一個輸出包括音譯,即某些字符(例如?
)被音譯為它們不太正確的“普通”對應物 ( z
) 以便在不支持原始字符的編碼中表示(此處?
為 Latin-1) .
第二個輸出沒有轉寫任何內容,它刪除了目標編碼中無法表示的任何字符(拉丁語 1 中的?
, ?
, ... )。
因此,我懷疑您可以使用與庫不同的選項的二進制文件。不熟悉libiconv
,好像//TRANSLIT
是省略了部分或者你使用的函數不支持...?
- 2 回答
- 0 關注
- 258 瀏覽
添加回答
舉報
0/150
提交
取消