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

使用Pythonnet在C#中调用Python出现输出编码乱码问题求助

解决C#通过Pythonnet调用Python时的字符串乱码问题

嗨,我之前在繁体中文Windows环境下用Pythonnet也碰到过一模一样的乱码问题,结合你的环境(Win10繁体中文、VS2017、Python3.6),核心原因基本都是编码不匹配——毕竟C#内部用UTF-16,Python默认编码在中文系统下可能不是UTF-8,再加上控制台编码的差异,很容易出乱码。下面给你几个亲测有效的解决方向:

1. 强制Python使用UTF-8编码

Python3.6在繁体中文系统中,默认的标准IO编码可能是Big5(950),和C#的编码体系不对齐。你可以在Python代码开头或者C#初始化时强制指定编码:

方法A:在Python代码中设置

import sys
# 强制标准输入输出用UTF-8
sys.stdout.encoding = 'utf-8'
sys.stdin.encoding = 'utf-8'

方法B:在C#初始化Python前设置环境变量

using System;
using Python.Runtime;

class Program
{
    static void Main(string[] args)
    {
        // 关键:设置Python的IO编码为UTF-8
        Environment.SetEnvironmentVariable("PYTHONIOENCODING", "utf-8");
        
        PythonEngine.Initialize();
        
        using (Py.GIL())
        {
            // 你的测试代码逻辑
            dynamic pyModule = Py.Import("your_python_module");
            string pyResult = pyModule.your_function();
            Console.WriteLine(pyResult);
        }
        
        PythonEngine.Shutdown();
    }
}

2. 处理控制台编码差异

繁体中文Windows的默认控制台编码是Big5(代码页950),就算Python和C#用了UTF-8,控制台直接打印UTF-8字符串也会乱码。你可以在C#里调整控制台的输出编码:

方案1:切换控制台到UTF-8编码

// 设置控制台输出为UTF-8
Console.OutputEncoding = System.Text.Encoding.UTF8;
// 同时修改控制台代码页为UTF-8(65001)
System.Diagnostics.Process.Start("chcp", "65001").WaitForExit();

方案2:转换为控制台默认编码

如果不想改控制台代码页,也可以把UTF-8字符串转成Big5再输出:

string utf8Result = "从Python获取的繁体中文内容";
byte[] utf8Bytes = System.Text.Encoding.UTF8.GetBytes(utf8Result);
string big5Result = System.Text.Encoding.GetEncoding(950).GetString(utf8Bytes);
Console.WriteLine(big5Result);

3. 字符串传递时显式编码转换

如果上面的方法还没解决,可以在Python和C#之间用字节流传递字符串,避免编码自动转换的坑:

Python端返回UTF-8字节

def get_chinese_string():
    # 将字符串编码为UTF-8字节返回
    return "測試繁體中文".encode('utf-8')

C#端解码为字符串

using (Py.GIL())
{
    dynamic pyModule = Py.Import("your_module");
    byte[] pyBytes = (byte[])pyModule.get_chinese_string();
    string result = System.Text.Encoding.UTF8.GetString(pyBytes);
    Console.WriteLine(result);
}

一般来说,先试方法1+方法2的组合,基本就能解决90%的乱码问题了。如果还是有问题,可以检查一下你的测试代码里有没有手动转码的逻辑,会不会多做了一次编码转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:32:36