使用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
相关产品推荐
相关产品推荐

