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
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...