[原創](Modern C++)現代C++的關鍵性概念: 文件編碼細節之一:BOM(Byte Order Mark, 字節順序標記)

常用網名: 豬頭三
出生日期: 1981.XX.XX
企鵝交流: 643439947
個人網站: 80x86匯編小站
編程生涯: 2001年~至今[共24年]
職業生涯: 22年
開發語言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python
開發工具: Visual Studio、Delphi、XCode、Eclipse、C++ Builder
技能種類: 逆向 驅動 磁盤 文件
研發領域: Windows應用軟件安全/Windows系統內核安全/Windows系統磁盤數據安全/macOS應用軟件安全
項目經歷: 磁盤性能優化/文件系統數據恢復/文件信息采集/敏感文件監測跟蹤/網絡安全檢測

[序言]
在現代軟件開發中, 文本文件的編碼問題至關重要, 尤其是在不同平臺、不同工具之間傳輸和處理文本文件時, 編碼格式的不一致可能會導致亂碼甚至解析錯誤. Unicode作為一種通用字符集, 為跨語言和跨平臺的文本存儲提供了解決方案, 其中BOM(Byte Order Mark, 字節順序標記)是一個關鍵性的編碼概念.?

[BOM作用]
BOM(Byte Order Mark)是Unicode編碼中的一個特殊字節序列, 主要作用如下:

1> 指明文件的編碼格式
? ?BOM可以用于指示文本文件使用的編碼格式, 例如UTF-8、UTF-16(LE/BE)、UTF-32(LE/BE).

2> 區分字節序(大小端)
? ?在UTF-16和UTF-32編碼中, 字符由兩個或多個字節組成, 不同系統可能采用不同的字節存儲順序(大端BE 或 小端LE), BOM可用于標識文件的字節序, 避免解析錯誤.

3> 兼容性問題
? ?理論上UTF-8不需要BOM, 因為UTF-8以單字節方式存儲ASCII兼容字符. 但某些Windows文字編輯器(如Notepad)會自動添加BOM(EF BB BF)作為標識, 以便區分UTF-8編碼和ANSI

4> 防止誤判編碼格式
? ?在沒有BOM的情況下, 某些軟件可能會誤判文件的編碼格式.

[常見BOM標記]
編碼格式? ? ? BOM 字節序列(十六進制)?? ?字節長度
UTF-8? ? ? ? ? EF BB BF? ? ? ? ? ? ? ? ? ? ? ? ? ? 3 字節
UTF-16 LE? ?FF FE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2 字節
UTF-16 BE ?FE FF? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2 字節
UTF-32 LE? ?FF FE 00 00? ? ? ? ? ? ? ? ? ? ? ?4 字節
UTF-32 BE? ?00 00 FE FF? ? ? ? ? ? ? ? ? ? ? 4 字節

[ANSI格式的文件不需要BOM]
ANSI不是一種具體的編碼, 而是Windows術語, 指"本地代碼頁編碼", 不需要額外的BOM標識.?

Windows 簡體中文(GBK/CP936)
Windows 繁體中文(Big5/CP950)
Windows 西歐語言(ISO-8859-1/CP1252)
Windows 日文(Shift-JIS/CP932)

Windows 記事本里"ANSI"選項實際上是本地代碼頁, 也就是默認使用本地語言的代碼頁. 比如日文Windows系統, 默認就使用(Shift-JIS/CP932). ANSI僅適用于Windows本地環境, 不適用于跨平臺開發, 因此在國際化應用中, 建議使用UTF-8(無 BOM).

[跨平臺問題]
1> UTF-8文件通常不建議使用BOM
? ?在跨平臺開發中, 推薦使用不帶BOM的UTF-8編碼, 特別是用于存儲源代碼和配置文件.

2> UTF-8源代碼文件避免BOM
? ?C++源代碼文件(UTF-8 編碼)如果帶BOM, 可能會導致某些編譯器(如 GCC)解析錯誤.

3> Windows Visual Studio默認使用帶BOM的UTF-8
? ?在Windows開發環境(如Visual Studio 2022)中, 默認情況下, UTF-8源代碼文件會包含BOM. 這可能導致代碼在Linux或macOS上出現兼容性問題.

4> Linux處理Windows生成的UTF-8文件可能出錯
? ?在Linux或macOS處理帶BOM的UTF-8文件時, 可能會因BOM被誤識別為文本內容而導致解析錯誤.

5> 讀取文本文件時, 可根據實際情況和需求, 檢查并移除BOM
? ?比如: 在編寫C++代碼時, 如果需要讀取UTF-8文件, 應檢查開頭是否有BOM, 并在必要時移除它.

[BOM 標識可以被移除]
在某些情況下, 讀取文本文件時BOM可能會被當作普通字符讀取, 導致解析問題. 例如:

* 二進制文件處理
? 如果按二進制模式讀取UTF-8、UTF-16 或 UTF-32文件, BOM也會被讀取出來.

[總結]
在現代C++開發中, 正確理解和處理BOM能有效避免編碼問題, 確保代碼在不同平臺上的兼容性和可讀性. 因此, 在編寫和讀取文本文件時, 建議盡量使用 UTF-8(無 BOM)格式, 以確保最大程度的跨平臺兼容性.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/894861.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/894861.shtml
英文地址,請注明出處:http://en.pswp.cn/news/894861.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LQB(0)-python-基礎知識

一、Python開發環境與基礎知識 python解釋器:用于解釋python代碼 方式: 1.直接安裝python解釋器 2.安裝Anaconda管理python環境 python開發環境:用于編寫python代碼 1.vscode 2.pycharm # 3.安裝Anaconda后可以使用網頁版的jupyter n…

C# 中記錄(Record)詳解

從C#9.0開始,我們有了一個有趣的語法糖:記錄(record)   為什么提供記錄? 開發過程中,我們往往會創建一些簡單的實體,它們僅僅擁有一些簡單的屬性,可能還有幾個簡單的方法,比如DTO等等&#xf…

使用 CSS 實現透明效果

在 CSS 中,實現透明效果有幾種方法,具體使用哪種方法取決于具體需求。以下是一些常見的方法: 使用 opacity 屬性: opacity 屬性可以設置整個元素的透明度,包括其所有的子元素。 .transparent { opacity: 0.5; /* 0 表…

MS17-010(永恒之藍1.0)漏洞遠程控制win7系統操作實戰小白通俗易懂

1.準備環境win7操作系統(被攻擊機)以及kali系統(攻擊機),kali使用msf工具進行攻擊。 2.打開kali終端,進入msf,輸入msfconsole然后等待啟動。 ┌──(root?kali-chifan)-[~] └─# msfconsole…

C語言:函數棧幀的創建和銷毀

目錄 1.什么是函數棧幀2.理解函數棧幀能解決什么問題3.函數棧幀的創建和銷毀的過程解析3.1 什么是棧3.2 認識相關寄存器和匯編指令3.3 解析函數棧幀的創建和銷毀過程3.3.1 準備環境3.3.2 函數的調用堆棧3.3.3 轉到反匯編3.3.4 函數棧幀的創建和銷毀 1.什么是函數棧幀 在寫C語言…

25/2/6 <機器人基礎> 運動學中各連桿的變換矩陣求法

變換矩陣 機器人通常包含多個關節和連桿,每個關節和連桿都有自己的局部坐標系。變換矩陣能夠將一個點或向量從一個坐標系轉換到另一個坐標系,從而實現對機器人各個部件位置和姿態的統一描述 變換矩陣能夠將復雜的運動分解為旋轉和平移的組合。通過矩陣乘…

AllData數據中臺核心菜單十二:數據同步平臺

🔥🔥 AllData大數據產品是可定義數據中臺,以數據平臺為底座,以數據中臺為橋梁,以機器學習平臺為中層框架,以大模型應用為上游產品,提供全鏈路數字化解決方案。 ?奧零數據科技官網:…

【FPGA】 MIPS 12條整數指令 【3】

實現乘除 修改框架 EX:實現帶符號乘除法和無符號乘除法 HiLo寄存器:用于存放乘法和除法的運算結果。Hi、Lo為32bit寄存器。電路描述與實現RegFile思想一致 仿真 代碼 DataMem.v include "define.v"; module DataMem(input wire clk,input…

【原子工具】快速冪 快速乘

題冪算.一切即1 陰陽迭變積微著,疊浪層巒瞬息功 莫道浮生千萬事,元知萬象一歸宗 文章目錄 快速冪原始快速冪(O(logn))二分遞歸形式非遞歸形式 模下意義的快速冪(O(logn))二分遞歸形式非遞歸形式 快速乘龜速…

文件基礎IO

理解"文件" 1-1 狹義理解 文件在磁盤里磁盤是永久性存儲介質,因此文件在磁盤上的存儲是永久性的磁盤是外設(即是輸出設備也是輸入設備)磁盤上的文件 本質是對文件的所有操作,都是對外設的輸入和輸出簡稱IO 1-2 廣義理…

Unity 簡易的UI框架

核心內容 UIType.cs namespace MYTOOL.UI {/// <summary>/// UI層級/// </summary>public enum UILayer{/// <summary>/// 主界面層/// </summary>MainUI 0,/// <summary>/// 普通界面層/// </summary>NormalUI 1,/// <summary>/…

VUE2雙向綁定的原理

文章目錄 VUE2雙向綁定的原理1. 什么是雙向綁定2. 雙向綁定的原理2.1 ViewModel的重要作用2.2 雙向綁定的流程 3. 雙向綁定的實現3.1 data響應化處理3.2 Compile編譯3.3 依賴收集 VUE2雙向綁定的原理 1. 什么是雙向綁定 講雙向綁定先講單項綁定&#xff0c;啥叫單項綁定&…

4G核心網的演變與創新:從傳統到虛擬化的跨越

4G核心網 隨著移動通信技術的不斷發展&#xff0c;4G核心網已經經歷了從傳統的硬件密集型架構到現代化、虛擬化網絡架構的重大轉型。這一演變不僅提升了網絡的靈活性和可擴展性&#xff0c;也為未來的5G、物聯網&#xff08;LOT&#xff09;和邊緣計算等技術的發展奠定了基礎。…

云計算——AWS Solutions Architect – Associate(saa)1、什么是云,AWS介紹

什么是云? 什么是云? 云計算(cloud computing)是基于互聯網的相關服務的增加、使用和交付模式&#xff0c;通常涉及通過互聯網來提供動態易護展且經常是虛擬化的資源。云是網絡、互聯網的一種比喻說法。 簡單理解為&#xff1a;云是 共享資源&#xff0c;按需付費&#xff0…

HTML排版標簽、語義化標簽、塊級和行內元素詳解

目錄 前言 一、HTML中的排版標簽 1. 文本相關標簽 1.1 標題標簽 ~ 1.2 段落標簽 1.3 強調和加粗 1.4 換行標簽 1.5 水平線標簽 二、HTML中的語義化標簽 2.1 語義化標簽概述 2.2 常見的語義化標簽 示例&#xff08;核心代碼部分&#xff09;&#xff1a; 三、HTM…

【字節青訓營-7】:初探 Kitex 字節微服務框架(使用ETCD進行服務注冊與發現)

本文目錄 一、Kitex概述二、第一個Kitex應用三、IDL四、服務注冊與發現 一、Kitex概述 長話短說&#xff0c;就是字節跳動內部的 Golang 微服務 RPC 框架&#xff0c;具有高性能、強可擴展的特點&#xff0c;在字節內部已廣泛使用。 如果對微服務性能有要求&#xff0c;又希望…

【數學】矩陣、向量(內含矩陣乘法C++)

目錄 一、前置知識&#xff1a;向量&#xff08;一列或一行的矩陣&#xff09;、矩陣1. 行向量2. 列向量3. 向量其余基本概念4. 矩陣基本概念5. 關于它們的細節 二、運算1. 轉置&#xff08;1&#xff09;定義&#xff08;2&#xff09;性質 2. 矩陣&#xff08;向量&#xff0…

TCP/IP 郵件

TCP/IP 郵件 引言 在互聯網技術飛速發展的今天,電子郵件(Email)已成為人們日常工作和生活中不可或缺的通信工具。TCP/IP協議作為互聯網通信的基礎,為電子郵件的傳輸提供了強大的技術支持。本文將詳細介紹TCP/IP在電子郵件傳輸過程中的作用,以及相關的協議和實現方式。 …

離線安裝Appium Server

1、問題概述? 安裝Appium通常有兩種方式: 第一種:下載exe安裝包,這種是Appium Server GUI安裝方式,缺點是通過命令啟動不方便。 第二種:通過cmd安裝appium server,可以通過命令方式啟動,比較方便。 問題:在沒有外網的情況下,無法通過命令在cmd中安裝appium server…

設計模式六大原則和單例模式

設計模式 目的 實現可重用解決方案&#xff0c;構筑易維護、可擴展的軟件系統。 六大原則 單一職責&#xff1a; 類的職責單一&#xff0c;一個方法做一件事。 開閉原則&#xff1a; 拓展開放&#xff0c;修改關閉。 里氏替換&#xff1a; 父類能出現的地方&#xff0c;子…