C# 英文系統上中文 string 顯示亂碼


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),官方文檔參考:

    https://docs.microsoft.com/zh-cn/dotnet/standard/base-types/character-encoding-introduction#utf-16-code-units

 

 

注 3:數據要能正確顯示主要涉及兩個步驟:數據的編碼與解碼

        log4net 中的編碼:配置中顯式指定輸出文件編碼 appender.Encoding = Encoding.GetEncoding("gb2312");

        控制台中的編碼:因為 C# string 類默認編碼為 UTF-16 是支持中文的,所以省略掉了。

        log4net 中的解碼:Notepad++ 設置編碼為 gb2312。

        控制台中的解碼:Console.OutputEncoding = Encoding.GetEncoding("gb2312");

  

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM