如何在Golang中将UTF-8字符串转换为ISO-8859-1?
在Go中实现UTF-8到ISO-8859-1(Latin-1)的转换
ISO-8859-1(Latin-1)包含前256个Unicode字符,丹麦的æ、ø、å正好在该范围内,可直接完成映射转换。以下是两种可行实现方案:
推荐方案:使用官方扩展库
借助golang.org/x/text/encoding/charmap库完成标准字符集转换,支持完整的错误处理和字符映射。
代码示例
package main import ( "fmt" "golang.org/x/text/encoding/charmap" "golang.org/x/text/transform" ) // UTF8ToISO88591 将UTF-8字符串转换为ISO-8859-1编码的字节切片 func UTF8ToISO88591(utf8Str string) ([]byte, error) { transformer := charmap.ISO8859_1.NewEncoder() result, _, err := transform.String(transformer, utf8Str) if err != nil { return nil, err } return []byte(result), nil } // FixMangledLatin1 修复错误解码场景:将被错误识别为UTF-8的ISO-8859-1字符(如Ãø)还原为原字符(如ø) func FixMangledLatin1(mangledStr string) (string, error) { latin1Bytes, err := charmap.ISO8859_1.NewDecoder().Bytes([]byte(mangledStr)) if err != nil { return "", err } return string(latin1Bytes), nil } func main() { // 测试正常UTF-8转ISO-8859-1 utf8Str := "Hej med dig! æøå" isoBytes, err := UTF8ToISO88591(utf8Str) if err != nil { fmt.Printf("转换失败:%v\n", err) return } fmt.Printf("UTF-8原串:%s\n", utf8Str) fmt.Printf("ISO-8859-1字节:%v\n", isoBytes) fmt.Printf("ISO-8859-1解码验证:%s\n", charmap.ISO8859_1.NewDecoder().String(string(isoBytes))) // 测试错误解码修复 mangledStr := "Hej æøå" fixedStr, err := FixMangledLatin1(mangledStr) if err != nil { fmt.Printf("修复失败:%v\n", err) return } fmt.Printf("\n错误解码串:%s\n", mangledStr) fmt.Printf("修复后串:%s\n", fixedStr) }
关键说明
- 若未安装依赖库,执行命令安装:
go get golang.org/x/text - 正常转换逻辑:通过编码器将UTF-8字符映射为对应ISO-8859-1字节
- 错误修复逻辑:针对"ISO-8859-1字节被错误按UTF-8解码"的场景,先解码回原字节再重新转换为正确字符串
轻量方案:手动字符映射(无第三方依赖)
仅针对已知丹麦字符场景,适合需求简单的情况:
package main import "fmt" func UTF8ToISO88591Simple(utf8Str string) []byte { var isoBytes []byte for _, r := range utf8Str { switch r { case 'æ': isoBytes = append(isoBytes, 0xE6) case 'ø': isoBytes = append(isoBytes, 0xF8) case 'å': isoBytes = append(isoBytes, 0xE5) case 'Æ': isoBytes = append(isoBytes, 0xC6) case 'Ø': isoBytes = append(isoBytes, 0xD8) case 'Å': isoBytes = append(isoBytes, 0xC5) default: if r <= 0xFF { isoBytes = append(isoBytes, byte(r)) } else { isoBytes = append(isoBytes, '?') // 超出Latin-1范围的字符替换为问号 } } } return isoBytes } func main() { utf8Str := "Hej med dig! æøå ÆØÅ" isoBytes := UTF8ToISO88591Simple(utf8Str) fmt.Printf("转换后ISO-8859-1字节:%v\n", isoBytes) fmt.Printf("解码验证:%s\n", string(isoBytes)) }
内容的提问来源于stack exchange,提问作者clarkk
相关产品推荐
相关产品推荐

