CodeMaster 2025-11-22 21:35 采纳率: 99%
浏览 10
已采纳

XUnity.AutoTranslator翻译乱码问题

使用XUnity.AutoTranslator时,常见乱码问题源于游戏文本编码与翻译插件解码方式不匹配。尤其在处理日文或韩文游戏时,若游戏使用Shift-JIS或EUC-KR编码,而插件默认以UTF-8解析,会导致中文或原文显示为乱码。此外,部分游戏通过字体纹理渲染文字,而非纯文本输出,也易造成AutoTranslator无法正确捕获和替换文本,进而引发乱码。解决此问题需手动配置正确的输入/输出编码格式,并启用“Force UTF-8”或调整Hook设置。同时,确保字库文件支持目标语言字符集,必要时更换支持多语言的字体方案,可有效缓解乱码现象。
  • 写回答

1条回答 默认 最新

  • 火星没有北极熊 2025-11-22 21:44
    关注

    一、XUnity.AutoTranslator乱码问题的成因分析

    在使用XUnity.AutoTranslator进行游戏汉化或本地化过程中,乱码是最常见且影响体验的核心问题之一。其根源主要集中在文本编码与解码机制的不匹配。

    • 多数日文游戏采用Shift-JIS编码存储字符串资源,韩文游戏则多使用EUC-KR。
    • XUnity.AutoTranslator默认以UTF-8格式解析所有输入文本流。
    • 当插件尝试将Shift-JIS编码的文本按UTF-8解码时,字节序列无法正确映射为字符,导致显示为“锟斤拷”、“”等典型乱码符号。
    • 此外,部分Unity游戏通过TextMeshPro或自定义UI系统渲染文字,实际输出的是字体纹理(Atlas)而非原始字符串,造成AutoTranslator无法Hook到真实文本内容。
    游戏语言常用编码AutoTranslator默认解码是否易出现乱码
    日文Shift-JISUTF-8
    韩文EUC-KRUTF-8
    中文(简体)GB2312/GBKUTF-8可能
    英文ASCIIUTF-8

    二、从技术栈视角剖析乱码触发路径

    深入理解Unity引擎中文本处理流程有助于定位乱码发生的具体环节:

    1. 游戏运行时加载AssetBundle中的文本资源。
    2. 资源以特定编码(如Shift-JIS)写入内存字符串对象。
    3. XUnity.AutoTranslator通过IL Hook拦截UnityEngine.Object.InstantiateText.text赋值操作。
    4. 插件尝试读取原始字符串并发送至翻译服务。
    5. 若未设置正确的InputEncoding,则解码失败。
    6. 返回的译文若目标编码不支持中文字符集(如仅含Latin-1),亦会二次乱码。
    7. 最终渲染阶段,若字体文件缺失CJK字形,即使文本正确也会显示为空白或方框。
    
    // 示例:手动指定编码配置(需修改AutoTranslator配置文件)
    {
      "Translation": {
        "InputEncoding": "shift-jis",
        "OutputEncoding": "utf-8",
        "ForceUtf8": true
      },
      "Hooks": [
        "UnityEngine.UI.Text.set_text",
        "TMPro.TextMeshProUGUI.set_text"
      ]
    }
        

    三、解决方案体系构建

    针对上述问题,可建立分层解决模型:

    graph TD A[检测乱码现象] --> B{判断来源类型} B -->|纯文本乱码| C[调整编码设置] B -->|纹理渲染乱码| D[启用Advanced Text Hook] C --> E[配置InputEncoding=shift-jis/euc-kr] E --> F[启用Force UTF-8输出] D --> G[替换字体为Noto Sans CJK] G --> H[验证字库覆盖范围] F --> I[测试翻译结果] I --> J[完成]

    具体实施步骤包括:

    • 编辑AutoTranslator.cfg或JSON配置文件,明确指定InputEncodingshift-jiseuc-kr
    • 开启“Force UTF-8”选项,确保内部统一使用UTF-8进行中转处理。
    • 对于使用TextMeshPro的游戏,需在Hook列表中添加TMP_Text.text相关方法。
    • 检查游戏所用字体是否包含中文字符轮廓;若无,则替换为开源字体如“思源黑体”或“Noto Sans SC”。
    • 可通过Font.GetOSInstalledFontNames()动态调试当前可用字体集合。
    • 对极端情况,考虑结合BepInExHarmony实现更底层的字符串捕获逻辑。

    四、高级调优与工程实践建议

    面向资深开发者,应引入自动化诊断机制:

    
    public static void DetectStringEncoding(byte[] rawData)
    {
        var encodings = new[] { Encoding.GetEncoding("shift-jis"), Encoding.GetEncoding("euc-kr"), Encoding.UTF8 };
        foreach (var enc in encodings)
        {
            string str = enc.GetString(rawData);
            if (Regex.IsMatch(str, @"[\u4e00-\u9fff]") || // 中文
                Regex.IsMatch(str, @"[\u3040-\u309f\u30a0-\u30ff]")) // 日文假名
            {
                Debug.Log($"Possible encoding: {enc.HeaderName}");
            }
        }
    }
        

    推荐建立如下工作流:

    阶段操作工具
    前期分析抓取内存字符串样本Cheat Engine / UnityExplorer
    编码识别使用CharsetDetector库自动推断Ude.NET / ICU4N
    字体适配注入支持多语言的TTFDynamic Font Replacer
    持续验证自动化截图比对SikuliX + OCR
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 11月23日
  • 创建了问题 11月22日