Visual Studio C++ 預設 UTF-8 編碼及 *.editorconfig 統一代碼格式

来源:https://www.cnblogs.com/mechanicoder/archive/2022/11/15/16894144.html
-Advertisement-
Play Games

使用 .editorconfig 統一規範 Visual Studio 編碼格式,使用 /utf-8 編譯選項指定源碼文件解碼格式,使得整個團隊文件編碼、代碼格式保持一致。 ...


轉載請註明原文鏈接:https://www.cnblogs.com/mechanicoder/p/16894144.html

1. 問題由來

背景:團隊使用 Visual Studio 進行跨平臺項目開發。

遇到的問題:

  1. 編碼:Windows平臺下源代碼文件格式可能是 GBK、IBM866、UTF16LE、UTF-8等等,中文字元串、註釋等跨平臺編譯時出現亂碼;
  2. 轉碼:Visual Studio 根據源代碼內容、系統區域設置(即本地化)自動確定源代碼編碼格式,含中文字元時存在不確定性;代碼中英字元串處理時需要格式來迴轉換,例如 ANSI->UTF8,無法統一;
  3. 規範:由於團隊成員個人 Visual Studio 編碼格式配置可能不同,例如 switch case 語句中的 case 是否縮進以及縮進量,經常遇到對源代碼反覆以不同風格進行格式化的情況;(文檔格式化快捷鍵 Ctrl+K,D;選中內容格式化快捷鍵 Ctrl+K,F)Visual Studio 雖然可以使用團隊統一配置,但修改不方便、修改內容無法高效的同步。

2. 解決方法

2.1. 文件編碼問題

首先,Visual Studio 代碼編輯器支持多種編碼格式,這從 Visual Studio 帶格式保存文件選項可以看出來。

圖1. 源碼高級保存選項

關鍵在於如何讓 Visual Studio 始終以 UTF-8 為預設編碼格式,而非由 IDE 本地化自動判斷,避免手動更改編碼格式。該問題在一個回答中找到了靠譜的解決方法(如何配置可以讓 Visual Studio 預設以 UTF-8 格式編碼且全局有效)。即通過一個可移植、可定製的文本編輯器配置文件 .editorconfig 對編輯器進行配置,以下引用回答內容:

Visual Studio supports EditorConfig files (EditorConfig)

Visual Studio (VS2017 and later) searches for a file named '.editorconfig' in the directory containing your source files, or anywhere above this directory in the hierarchy. This file can be used to direct the editor to use utf-8. I use the following:

[*]
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 4

The [*] line is a mask and means for all files - the scope of the commands can be reduced using e.g. [*.{h,cpp}]

There are further possibilities, particularly for C# files. Full details can be found at EditorConfig settings - Visual Studio (Windows) | Microsoft Learn

根據 Visual Studio 官方介紹,Visual Studio 啟動時將會自動從源碼文件所在文件夾開始搜索該文件,直至找到位於頂層目錄的文件或沒有找到。因此使用時將其放在代碼倉庫的根目錄即可。

圖2. 代碼目錄結構--圖片來自 Visual Studio 官網

那麼,是否可以自動生成一個 .editorconfig 文件呢?

Visual Studio 支持根據本地設置生成一個 .editorconfig 文件,操作路徑為:

Tools / Options / Text Editor / C/C++ / Code Stype / General: Generate .editorconfig file from settings.

圖3. 生成 .editorconfig 文件,截圖來自 Microsoft Visual Studio Community 2022 (64-bit) - Current Version 17.2.1

得到 .editorconfig 之後就可以進行配置了,例如上述回答中的含義分別時(以下內容是 .editorconfig 的一部分,配置文件支持以 # 開始的註釋):

[*]
end_of_line = lf                    # 行尾 UNIX 格式 LF
charset = utf-8                     # 文件編碼字元集為 UTF-8
trim_trailing_whitespace = true     # 刪除文件末尾空格
insert_final_newline = true         # 末尾插入新行
indent_style = space                # 以空格代替 tab
indent_size = 4                     # 代替 tab 的空格數量

Visual Studio 支持的特性 VS官網鏈接,或 editorconfig官網鏈接。 

如何將已有文件轉碼:實現Python腳本,按原編碼讀入數據並按 UTF-8 格式寫出即可。

註意:配置文件修改後需要重啟 Visual Studio,通過文檔格式化(Ctrl+K,D)判斷配置是否生效,如查看格式化前後的空格數量。

2.2. 編譯問題

自動轉碼後編譯時可能遇到各種異常編譯的錯誤或警告(如4819),這些錯誤是由於 Visual Studio 未按 UTF-8 格式進行編譯導致的。既然文本編輯器支持以 UTF-8 編碼的源文件,那麼編譯器也必然支持以 UTF-8 編碼格式解析源文件。

這裡需要指定編譯選項 /utf-8 告訴編譯器以 UTF-8 對源文件進行解碼,可參考官方文檔

直接通過 Visual Studio 配置項目時,進行如下設置:

圖4. 指定 /utf-8 編譯選項,截圖來自 Microsoft Visual Studio Community 2022 (64-bit) - Current Version 17.2.1

 通過 CMake 配置項目時,cmake 腳本指令:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8")

指定 /utf-8 編譯選項後,當編譯文件或由源文件所包含的頭文件非 UTF-8 編碼時,將會出現大量如下警告信息,他們可以通過 Visual Studio 禁用警告編號選項關閉。

warning C4828: The file contains a character starting at offset 0x453 that is illegal in the current source character set (codepage 65001).

或通過 cmake 腳本指令:

add_compile_options(/wd4828)

2.3. 其他方法[不建議]

關於編譯警告4819的問題,有網友回答(原回答鏈接)可通過修改系統本地化設置解決,經測試確實可修複,設置路徑如下:

控制面板 / 時鐘 / 區域 / 區域 / 管理 / 更改系統區域設置,使用Unicode UTF8提供全球語言支持

圖5. 更改系統區域設置

 這種解決方法存在副作用。本地化是系統全局設置,可能將影響其他應用程式,當然微軟自家的應用程式相信都已經做了很好的適配。作者電腦上一款軟體中文版就在執行上述設置後出現了亂碼,英文版正常。

此外,2.1 中所述的指定編譯選項 /utf-8 同樣可以解決該警告問題,因此不建議更改系統區域設置。

參考資料

1. How to config visual studio to use UTF-8 as the default encoding for all projects? - Stack Overflow

2. EditorConfig

3. EditorConfig settings - Visual Studio (Windows) | Microsoft Learn

4. /utf-8 (Set source and execution character sets to UTF-8) | Microsoft Learn

5. [Solved]-warning c4819 in Visual Studio C++ 2013 express - utf8 files without bom-C++

6. cmake 添加編譯選項的幾種方式 - 簡書

7. VS CMake 禁止警告 - 心靈捕手 - 博客園

 

轉載請註明原文鏈接:https://www.cnblogs.com/mechanicoder/p/16894144.html


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

-Advertisement-
Play Games
更多相關文章
  • electron vue3 項目搭建 一.vue項目搭建 安裝electron 需要搭建vue項目,這裡用的vue3項目。 1.安裝 下載 node 這裡用的16版本 https://nodejs.org/zh-cn/ 2.設置淘寶鏡像 npm config set registry https:/ ...
  • 有足夠的地圖數據,可以點擊到街道,示例我只出到市級 以umi為框架,版本是: "react": "^18.2.0", "umi": "^4.0.29", "echarts": "^5.4.0", "echarts-for-react": "^3.0.2", 示例圖: 示例中需要地圖的Geojson數 ...
  • 瀑布流算是比較常見的佈局了,一個般常見縱向瀑布流的交互,當我們滾動到底的時候載入下一頁的數據追加到上去。因為一次載入的數據量不是很多,頁面操作是也不會有太大的性能消耗。但是如果當你一直往下滾動載入,載入幾十頁的時候,就會開始感覺不那麼流暢的,這是因為雖然每次操作的很少,但是頁面的 DOM 越來越多,... ...
  • vue中的ajax vue腳手架配置代理 方法一 ​ 在vue.config.js中添加如下配置: devServer:{ proxy:"http://localhost:5000" } 說明: 優點:配置簡單,請求資源時直接發給前端(8080)即可。 缺點:不能配置多個代理,不能靈活的控制請求是否 ...
  • 獲取微信昵稱、頭像、OpenID 微信公眾號服務號的網頁授權功能開發,主要是通過js跳轉到一個微信提供的url 然後微信會彈出獲取昵稱頭像的按鈕 允許獲取後,會回跳到我們的網址上,並且帶著一個code參數 我們拿到code參數,調用介面獲取到獲取到昵稱頭像、以及openid。這樣就拿到了微信客戶的主 ...
  • 函數模板 模板的意義:對類型也參數化 int sum1(int a,int b){return a+b;} double sum2(double a ,double b){return a+b;} 幾個概念 函數模板 模板的實例化 模板函數 模板類型參數 模板非類型參數 模板實參推演 模板的特例化 ...
  • # 1.公共操作 # del 刪除 刪除變數或指定容器內數據 變數,容器裡面的值 # + 將兩個相同類型序列進行連接 字元串,列表,元組 print('1.公共操作') print('a' + 'b') print(['a'] + ['b']) print(('a',)+('b',)) # 元組,要 ...
  • 小伙伴們曾經可能都經歷過整天寫著CURD的業務,都沒寫過一些組件相關的東西,這篇文章記錄一下SpringBoot如何自定義一個Starter。 原理和理論就不用多說了,可以在網上找到很多關於該方面的資料,這裡主要分享如何自定義。 原文鏈接:SpringBoot怎麼自定義一個Starter ?一隻小C ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...