這是我使用的 UCS-2 編碼的示例字符串:abvgd?e?zijklmnjoprst?uvhc?d??1234567890*+;'使用 iconv 二進制文件將 UCS-2 轉(zhuǎn)換為 iso ISO-8859-1//TRANSLIT 時,我得到:abvgd?ezzijklmnjoprstcuvhccdzs1234567890*+;'現(xiàn)在我想在 go 項目中使用 libiconv。我正在使用這個庫 github.com/qiniu/iconv 作為 libiconv 的綁定。但是當(dāng)使用綁定時,我得到:abvgd?e?zijklmnjoprst?uvhc?d??1234567890*+;'就像在 go 中使用 library 時應(yīng)用不同的音譯規(guī)則一樣。我檢查了 go bindings 庫,一切似乎都井井有條;只傳遞字節(jié),因此不會發(fā)生“信息丟失”。使用 libiconv 時還有什么我應(yīng)該注意的嗎?是否有一些環(huán)境上下文可以觸發(fā)不同的音譯行為?編輯(關(guān)于調(diào)用的附加說明):我有兩個文件“ucs-2.txt”和“l(fā)atin1.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 中,我使用這些行從這些文件中提取內(nèi)容: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)}這個函數(shù)正在做轉(zhuǎn)換: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)
為什么在使用 libiconv 而不是 iconv 二進制文件時會得到不同的結(jié)果?
30秒到達戰(zhàn)場
2021-10-25 20:17:13