只有累積,沒有奇蹟

2019年3月9日 星期六

[.NETCore] ASP.Net Core 使用 Big5 中文編碼

問題
在 .NET Framework 時要取得中文編碼可以使用  Encoding.GetEncoding("BIG5"),今天在練習專案時遇到類似的情境很直覺的在將 Code 套用在 .NET Core 上,沒想到竟然發生錯誤,這邊簡單紀錄遇到這問題該怎麼解決以及根本原因,有任何問題歡迎留言一起討論

解決方式
 "ArgumentException: 'Big5' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.  錯誤訊息明確的提到不支援 big5 編碼,心理OS是為什麼在 .NET Framework 使用很正常為啥在 .NET Core 就異常了呢 ? 因此第一步是先好奇在 .NET Core 所支援的編碼到底有哪幾,透過以下代碼,可以得知目前在 .Core 2.1 中支援的編碼有那些
  1. private static void GetEncodingInfos()
  2. {
  3. var encodings = Encoding.GetEncodings();
  4.  
  5. foreach (var t in encodings)
  6. {
  7. Console.WriteLine($"DisplayName:{t.DisplayName}, codePage: {t.CodePage}");
  8. }
  9. }
輸出結果如下,可以得知目前  .NET Core 2.1 內建支援 8 種編碼方式  
  1. NETCoreLogging> DisplayName:Unicode, codePage: 1200
  2. NETCoreLogging> DisplayName:Unicode (Big-Endian), codePage: 1201
  3. NETCoreLogging> DisplayName:Unicode (UTF-32), codePage: 12000
  4. NETCoreLogging> DisplayName:Unicode (UTF-32 Big-Endian), codePage: 12001
  5. NETCoreLogging> DisplayName:US-ASCII, codePage: 20127
  6. NETCoreLogging> DisplayName:Western European (ISO), codePage: 28591
  7. NETCoreLogging> DisplayName:Unicode (UTF-7), codePage: 65000
  8. NETCoreLogging> DisplayName:Unicode (UTF-8), codePage: 65001
稍微爬了文章後發現在 .NET Core 專案不在支援像是 .NET Framework 一脫拉庫的編碼方式,僅支援常用的八種,有需要可以透過下載取得;這時回想到上課時講師也提過 .NET Core 設計思考方向是精簡化保留最核心的 API,其他 API 如果要用的時候在透過 Nuget 的方式下載即可,也就是需要時甚麼在下載/安裝相關套件或是 library,而不是全部包起來同捆包的概念;知道想要的中文編碼 BIG5 不支援已經是事實,要使用就要先安裝 system.text.encoding.codepages,以下為安裝說明

安裝 System.Text.Encoding.CodePages 
如上面提到,如果需要更多編碼需要透過 nuget 進行下載  System.Text.Encoding.CodePages 套件,因此開啟 Nuget packer Manager 輸入System.Text.Encoding.CodePages,目前提供版本為 4.5.1 點擊下載
或是直接在 package console 輸入下列代碼  
  1. Install-Package System.Text.Encoding.CodePages -Version 4.5.1

註冊 EncodingProvider
安裝完成之後不會自動支援內建之外的編碼,需要在透過下列代碼來設定
  1. Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Encoding.RegisterProvider 
註冊 encoding provider,此方法提供讓開發者可以註冊在目標平台不支援的編碼方式  CodePagesEncodingProvider.Instance 
Instance 屬性會回傳 Encoding provider 物件

重新驗證
如上述所提到修改範圍,最後代碼如下
  1. static void Main(string[] args)
  2. {
  3. Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
  4. var big5 = Encoding.GetEncoding(950);
  5. Console.WriteLine($"Name : {big5.EncodingName} , CodePage :{big5.CodePage}");
  6. Console.ReadKey();
  7. }
執行程式後結果
順利過關,打完收工

參考
难道.NET Core到R2连中文编码都不支持吗?

Related Posts:

  • [.NETCore] Windows Service - 服務並未以適時的方式回應啟動或控制請求。前言 在上一篇有提到如何使用指令 註冊 Window Service 服務,提到了如何用指令操作 Windows Service 看啟用的狀態,但有時在啟動時會發生錯誤造成啟動失敗的狀況發生,舉例來說在啟動服務時跳出  'Windows 無法啟動,本機電腦的 TestService 服務,錯誤 1503 : 服務並未已適時的方式回應啟動獲控制請求。 這篇要說明的是在註冊服務當下發生異常的處理方式,若有問題歡… Read More
  • [NETCore] 結構化日誌 Serilog 初體驗前言 在 .NET 使用日誌框架第一時間會想到 NLog 或是 Log4Net 兩種 Log 常使用的 Library,Serilog 是這幾年快速崛起的 Log 框架之一,Serilog 是以 Structured logging 為基礎進行設計,透過 logging API 可以輕鬆的記錄應用程式中對象屬性,方便快速進行 logging 內容進行查詢與分析,並將其紀錄內容透過 json (可指定) 的方式輸出,這篇就介紹 … Read More
  • [NETCore] 結構化日誌 Serilog - Events Types 和 Enrichment 前言 前兩篇分別介紹了關於 Serilog 的基礎應用與設定,這篇就來針對事件類型 Event Type 與 介紹幾個常用的 Enricher,若有問題或是錯誤的地方歡迎提出來一起討論。 Event Type 結構化日誌的好處是可以清楚的分辨"每一次"紀錄的事件,舉例來說下列簡單的代碼是透過 Serilog 寫入log 到 Console 與 File 檔案,紀錄內容是 3 筆資料 Log.Logger = new LoggerCo… Read More
  • [.NETCore] ASP.NET Core 環境佈署設定 appsettings.json 前言 在上一篇 [.NETCore] ASP.NET Core - ENVIRONMENT 提到了如何設定環境變數值,今天要提的也是與 Configuration 相關的,在開發時往往會因為不同環境讀取不同 Config 的需求,舉例來說如果 Development 與 Staging 環境的資料庫不同時,就會有在不同環境讀取各自的 DB 連線字串設定需求,這篇就介紹如何透過 .NET Core 專案預設的 appsettin… Read More
  • [NETCore] 結構化日誌 Serilog - 配置設定 前言 上一篇在 結構化日誌 Serilog 初體驗 介紹了關於 Serilog 的基本操作,這篇是針對 Serilog 在 ASP.NET Core 的設定與 Config 做進一步的介紹,若有問題或是錯誤的地方歡迎提出來一起討論或是給予指導。 基本使用 首先先來回顧一下基本使用方式,在 Serilog 如果要紀錄 Log 資訊必須使用  LoggerConfiguration&n… Read More

0 意見:

張貼留言

Copyright © 2025 m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com