【C# 代碼小知識】畫蛇添足的編碼首碼

来源:https://www.cnblogs.com/gl1573/archive/2020/02/10/12289999.html
-Advertisement-
Play Games

我們都知道,文件有不同的編碼,例如我們常用的中文編碼有:UTF8、GK2312 等。 Windows 操作系統中,新建的文件會在起始部分加入幾個字元的首碼,來識別編碼。 例如,新建文本文件,寫入單詞 ,另存為 UTF8。 占 5 個位元組,但文本大小卻是 8 個位元組。(win7 系統下還是這樣的,wi ...


我們都知道,文件有不同的編碼,例如我們常用的中文編碼有:UTF8、GK2312 等。

Windows 操作系統中,新建的文件會在起始部分加入幾個字元的首碼,來識別編碼。

例如,新建文本文件,寫入單詞 Hello,另存為 UTF8。Hello 占 5 個位元組,但文本大小卻是 8 個位元組。(win7 系統下還是這樣的,win10 已經去掉了編碼首碼,所以 win10 下文件大小依然是 5 個位元組。看來微軟自己也改變了。)

我們用 StreamWriter 來生成文件。

using (StreamWriter sw = new StreamWriter("a.txt"))
{
    sw.Write("Hello");  // 5 位元組
}

using (StreamWriter sw = new StreamWriter("b.txt", false, Encoding.UTF8))
{
    sw.Write("Hello");  // 8 位元組
}

詭異的事情發生了,StreamWriter 的預設編碼是 UTF8,都是用的 UTF8 編碼,怎麼文件的大小會不一樣呢?

UTF8Encoding 有兩個私有屬性:emitUTF8IdentifierisThrowException,初始化時由構造函數傳入。

  • emitUTF8Identifier 表示是否添加編碼首碼
  • isThrowException 表示遇到編碼錯誤時是否報錯

由此可見,是否添加編碼首碼,是可以控制的。

EncodingUTF8 定義如下,添加編碼首碼。

public static Encoding UTF8 {
    get {
        if (utf8Encoding == null) utf8Encoding = new UTF8Encoding(true);
        return utf8Encoding;
    }
}

StreamWriter 中使用的預設編碼,emitUTF8Identifier=false

internal static Encoding UTF8NoBOM {
    get { 
        if (_UTF8NoBOM == null) {
            UTF8Encoding noBOM = new UTF8Encoding(false, true);
            _UTF8NoBOM = noBOM;
        }
        return _UTF8NoBOM;
    }
}

這就是開頭的代碼中兩個文件大小不一樣的原因了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 運算符用於在程式運行時執行數學或邏輯運算。 運算符 Go 語言內置的運算符有: 算術運算符 關係運算符 邏輯運算符 位運算符 賦值運算符 算數運算符 運算符描述 + 相加 - 相減 * 相乘 / 相除 % 求餘 註意: ++(自增)和--(自減)在Go語言中是單獨的語句,並不是運算符。 關係運算符 ...
  • 流程式控制制是每種編程語言控制邏輯走向和執行次序的重要部分,流程式控制制可以說是一門語言的“經脈”。 Go語言中最常用的流程式控制制有if和for,而switch和goto主要是為了簡化代碼、降低重覆代碼而生的結構,屬於擴展類的流程式控制制。 if else(分支結構) if條件判斷基本寫法 Go語言中if條件判斷 ...
  • 本文主要介紹Go語言中切片(slice)及它的基本使用。 因為數組的長度是固定的並且數組長度屬於類型的一部分,所以數組有很多的局限性。 例如: func arraySum(x [3]int) int{ sum := 0 for _, v := range x{ sum = sum + v } ret ...
  • ASP .NET CORE 源碼地址:https://github.com/dotnet/ 下拉可以查找相應的源碼信息, 例如:查找 ASP .NET CORE Microsoft.Extensions.Hosting 源碼地址:https://github.com/dotnet/extension ...
  • 目 錄 1. 概述... 2 2. 平臺演示... 2 3. 控制端與iNeuKernel的交互協議... 3 4. 設備驅動實現控制業務... 4 5. 應用效果... 9 5.1 CS客戶端... 9 5.2 BS瀏覽器... 9 5.3 Linux環境測試... 10 5.4 視頻應用效果.. ...
  • 前面三章介紹了WPF資源系統,使用資源可在一個地方定義對象而在整個標記中重用他們。儘管可使用資源存儲各種對象,但使用資源最常見的原因之一是通過他們的保存樣式。 樣式是可應用於元素的屬性值集合。WPF樣式系統與HTML標記中的層疊樣式表(Cascading Style Sheet,CSS)標準擔當類似 ...
  • FTP的中文名稱是“文件傳輸協議”,是File Transfer Protocol三個英文單詞的縮寫。FTP協議是TCP/IP協議組中的協議之一,其傳輸效率非常高,在網路上傳輸大的文件時,經常採用該協議。 一個完整的FTP由FTP伺服器和FTP客戶端組成,客戶端可以將伺服器上的文件通過FTP協議下載... ...
  • NanUI是一個開放源代碼的.NET項目,它適用於希望使用HTML5 / CSS3等前端技術來構建Windows窗體應用用戶界面的.NET / .NET Core開發人員。這是NanUI 0.7版本的發佈公告。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...