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

Golang中Unicode转GSM编码实现需求及示例求助

UTF-8 转 GSM 编码的 Go 实现方案

针对你把Python项目迁移到Go时遇到的UTF-8转GSM编码需求,这里提供对应的实现思路和代码示例,逻辑和你给出的Python代码对齐:

核心思路

  1. 明确GSM 03.38字符集的范围,判断字符是否属于GSM编码支持的范围;
  2. 对非GSM的UTF-8字符,通过音译映射转换为对应的ASCII/GSM字符(比如ằ转a);
  3. 全程验证转换后的字符是否符合GSM规范,若无法完成有效转换则返回原文本。

代码实现

1. 定义GSM字符集与音译映射

首先定义GSM基础字符集,以及需要音译的字符映射(可根据需求扩展):

package main

import (
    "fmt"
    "strings"
)

// GSM 03.38基础字符集
var gsmChars = map[rune]bool{
    '@': true, '£': true, '$': true, '¥': true, 'è': true, 'é': true, 'ù': true, 'ì': true,
    'ò': true, 'Ç': true, '\n': true, 'Ø': true, 'ø': true, '\r': true, 'Å': true, 'å': true,
    'Δ': true, '_': true, 'Φ': true, 'Γ': true, 'Λ': true, 'Ω': true, 'Π': true, 'Ψ': true,
    'Σ': true, 'Θ': true, 'Ξ': true, 'Æ': true, 'æ': true, 'ß': true, 'É': true, ' ': true,
    '!': true, '"': true, '#': true, '¤': true, '%': true, '&': true, '\'': true, '(': true,
    ')': true, '*': true, '+': true, ',': true, '-': true, '.': true, '/': true, '0': true,
    '1': true, '2': true, '3': true, '4': true, '5': true, '6': true, '7': true, '8': true,
    '9': true, ':': true, ';': true, '<': true, '=': true, '>': true, '?': true, '¡': true,
    'A': true, 'B': true, 'C': true, 'D': true, 'E': true, 'F': true, 'G': true, 'H': true,
    'I': true, 'J': true, 'K': true, 'L': true, 'M': true, 'N': true, 'O': true, 'P': true,
    'Q': true, 'R': true, 'S': true, 'T': true, 'U': true, 'V': true, 'W': true, 'X': true,
    'Y': true, 'Z': true, 'Ä': true, 'Ö': true, 'Ñ': true, 'Ü': true, '§': true, '¿': true,
    'a': true, 'b': true, 'c': true, 'd': true, 'e': true, 'f': true, 'g': true, 'h': true,
    'i': true, 'j': true, 'k': true, 'l': true, 'm': true, 'n': true, 'o': true, 'p': true,
    'q': true, 'r': true, 's': true, 't': true, 'u': true, 'v': true, 'w': true, 'x': true,
    'y': true, 'z': true, 'ä': true, 'ö': true, 'ñ': true, 'ü': true, 'à': true,
}

// 音译映射:非GSM字符转GSM兼容字符
var transliterations = map[rune]rune{
    'ằ': 'a', 'ắ': 'a', 'ẳ': 'a', 'ẵ': 'a', 'ặ': 'a',
    'ầ': 'a', 'ấ': 'a', 'ẩ': 'a', 'ẫ': 'a', 'ậ': 'a',
    'è': 'e', 'é': 'e', 'ẻ': 'e', 'ẽ': 'e', 'ẹ': 'e',
    'ề': 'e', 'ế': 'e', 'ể': 'e', 'ễ': 'e', 'ệ': 'e',
    'ì': 'i', 'í': 'i', 'ỉ': 'i', 'ĩ': 'i', 'ị': 'i',
    'ò': 'o', 'ó': 'o', 'ỏ': 'o', 'õ': 'o', 'ọ': 'o',
    'ồ': 'o', 'ố': 'o', 'ổ': 'o', 'ỗ': 'o', 'ộ': 'o',
    'ù': 'u', 'ú': 'u', 'ủ': 'u', 'ũ': 'u', 'ụ': 'u',
    'ừ': 'u', 'ứ': 'u', 'ử': 'u', 'ữ': 'u', 'ự': 'u',
    // 可根据需要添加更多字符映射
}

2. 辅助判断与转换函数

// 判断字符是否属于GSM字符集
func isGSM(r rune) bool {
    return gsmChars[r]
}

// 将UTF-8文本转换为GSM编码文本,返回转换结果和是否成功
func ConvertUTF8ToGSM(text string) (string, bool) {
    var result strings.Builder
    gsmValid := true

    for _, r := range text {
        if isGSM(r) {
            result.WriteRune(r)
            continue
        }

        // 尝试获取音译后的字符
        translitR, exists := transliterations[r]
        if !exists {
            gsmValid = false
            break
        }

        // 检查音译结果是否有效
        if translitR == '?' || translitR == 0 {
            gsmValid = false
            break
        }

        // 验证音译后的字符是否属于GSM
        if !isGSM(translitR) {
            gsmValid = false
            break
        }

        result.WriteRune(translitR)
    }

    // 最终验证整个结果是否全为GSM字符
    finalStr := result.String()
    for _, r := range finalStr {
        if !isGSM(r) {
            gsmValid = false
            break
        }
    }

    if gsmValid {
        return finalStr, true
    }
    // 转换失败返回原文本
    return text, false
}

3. 使用示例

func main() {
    testCases := []string{"ằhello", "test123", "汉字测试"}
    for _, tc := range testCases {
        output, success := ConvertUTF8ToGSM(tc)
        if success {
            fmt.Printf("输入: %s → 转换结果: %s\n", tc, output)
        } else {
            fmt.Printf("输入: %s → 无法转换为GSM编码,返回原文本\n", tc)
        }
    }
}

补充说明

  • GSM字符集分为基础集和扩展集,上面的gsmChars只包含基础集,若需要支持扩展字符(如^、{等),需要额外处理转义逻辑;
  • 音译映射可参考Python unidecode库的规则,扩展更多字符对,满足不同语言的转换需求;
  • 逻辑完全对齐你提供的Python代码:优先保留GSM字符,非GSM字符尝试音译,全程验证有效性,最终返回符合要求的GSM文本或原文本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:18:32