亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在使用 libiconv 而不是 iconv 二進制文件時會得到不同的結果?

為什么在使用 libiconv 而不是 iconv 二進制文件時會得到不同的結果?

Go
30秒到達戰場 2021-10-25 20:17:13
這是我使用的 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是省略了部分或者你使用的函數不支持...?


查看完整回答
反對 回復 2021-10-25
?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

音譯取決于語言環境??赡苁悄愕?libiconv 缺少/有錯誤的語言環境?;蛘吣谀抢锸褂玫恼Z言環境沒有配置音譯。



查看完整回答
反對 回復 2021-10-25
  • 2 回答
  • 0 關注
  • 258 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號