You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:31:06