1. 问题现象:用 log4net 记录异常信息 Exception e 的 e.Message(string 类型) 在英文系统不能正常显示,显示为 ?????(中文系统能正常显示)。
简单起见,测试时直接用 log4net 输出中文 string(testStr = “中文乱码测试abc123”),测试 log 显示如下:
2. 问题分析:英文系统和中文系统的默认编码不一样,log4net 没有显式设置输出文件编码时使用了系统的默认编码,而英文系统的默认编码不支持中文显示。
3. 解决方案:
步骤一:log4net 配置中指定输出文件编码 appender.Encoding = Encoding.GetEncoding("gb2312") ,如下图所示:
步骤二:重新编译运行程序生成日志后,用 Notepad++ 打开日志文件,输出显示如下图所示( 依旧是乱码,不要慌,看下一个步骤):
步骤三:将 Notepad++ 的编码指定为 gb2312,如下图所示:
Notepad++ 指定编码 gb2312 后,即可正常显示中文,如下图所示:
注 1:控制台显示中文乱码,原因相同。解决方案如下:
打印输出前,显式指定控制台编码: Console.OutputEncoding = Encoding.GetEncoding("gb2312");
注 2:C# string 类的默认编码为 UTF-16(Unicode),官方文档参考:
注 3:数据要能正确显示主要涉及两个步骤:数据的编码与解码。
log4net 中的编码:配置中显式指定输出文件编码 appender.Encoding = Encoding.GetEncoding("gb2312");
控制台中的编码:因为 C# string 类默认编码为 UTF-16 是支持中文的,所以省略掉了。
log4net 中的解码:Notepad++ 设置编码为 gb2312。
控制台中的解码:Console.OutputEncoding = Encoding.GetEncoding("gb2312");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗