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

如何在Golang中将字幕文件编码转换为UTF-8?

字幕编码检测与UTF-8转换方案

现有检测函数的注意点

你当前的CheckEncoding函数依赖http.DetectContentType,但这个方法更偏向MIME类型检测,对部分非UTF-8编码(如GBK、Big5)的识别准确率有限。如果需要更精准的编码检测,可使用github.com/saintfish/chardet库,不过先基于你现有函数完成转换逻辑。

编码转换实现(基于官方编码库)

使用golang.org/x/text/encoding和golang.org/x/text/transform包完成编码转换,这是Go生态中处理编码的标准方案,无需依赖第三方iconv库。

完整代码示例

package main

import (
	"net/http"
	"os"
	"strings"

	"golang.org/x/text/encoding"
	"golang.org/x/text/encoding/charmap"
	"golang.org/x/text/encoding/japanese"
	"golang.org/x/text/encoding/korean"
	"golang.org/x/text/encoding/simplifiedchinese"
	"golang.org/x/text/encoding/traditionalchinese"
	"golang.org/x/text/transform"
)

// 你原有的检测函数(修正了错误处理)
func CheckEncoding(filePath string) (encode string, err error) {
	content, err := os.ReadFile(filePath)
	if err != nil {
		return "", err
	}
	contentType := http.DetectContentType(content)
	parts := strings.Split(contentType, " ")
	if len(parts) < 2 {
		return "", nil
	}
	encodePart := strings.Split(parts[1], "=")
	if len(encodePart) < 2 {
		return "", nil
	}
	encode = encodePart[1]
	return encode, nil
}

// 根据编码名称获取对应的解码器
func getDecoder(encode string) encoding.Encoding {
	switch strings.ToLower(encode) {
	case "gbk", "gb2312", "gb18030":
		return simplifiedchinese.GBK
	case "big5":
		return traditionalchinese.Big5
	case "euc-jp", "shift_jis":
		return japanese.ShiftJIS
	case "euc-kr":
		return korean.EUCKR
	case "iso-8859-1", "latin1":
		return charmap.ISO8859_1
	default:
		return nil
	}
}

// 将文件从指定编码转换为UTF-8并保存
func ConvertToUTF8(srcPath, dstPath string) error {
	// 读取原文件内容
	srcContent, err := os.ReadFile(srcPath)
	if err != nil {
		return err
	}

	// 检测原编码
	encode, err := CheckEncoding(srcPath)
	if err != nil {
		return err
	}

	// 如果已经是UTF-8,直接复制文件
	if strings.ToLower(encode) == "utf-8" {
		return os.WriteFile(dstPath, srcContent, 0644)
	}

	// 获取解码器
	decoder := getDecoder(encode)
	if decoder == nil {
		return os.ErrInvalid
	}

	// 转换编码为UTF-8
	utf8Content, _, err := transform.Bytes(decoder.NewDecoder(), srcContent)
	if err != nil {
		return err
	}

	// 写入目标文件
	return os.WriteFile(dstPath, utf8Content, 0644)
}

// 示例调用
func main() {
	err := ConvertToUTF8("input.srt", "output_utf8.srt")
	if err != nil {
		panic(err)
	}
}

使用说明

  1. 安装依赖库:
go get golang.org/x/text/encoding
  1. 扩展getDecoder函数中的编码映射,覆盖你需要处理的字幕编码类型(如常见的GBK、Big5、Shift_JIS等)。
  2. 调用ConvertToUTF8函数,传入原文件路径和目标文件路径即可完成转换。

关键细节说明

  • 直接处理字节流,避免字符串转换带来的编码丢失问题。
  • 若检测到原文件已是UTF-8,直接复制文件,无需额外转换。
  • 解码器覆盖了主流字幕编码类型,可根据实际需求补充扩展。

内容的提问来源于stack exchange,提问作者mona moghadampanah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:30:22