使用 .editorconfig 統一規範 Visual Studio 編碼格式,使用 /utf-8 編譯選項指定源碼文件解碼格式,使得整個團隊文件編碼、代碼格式保持一致。 ...
轉載請註明原文鏈接:https://www.cnblogs.com/mechanicoder/p/16894144.html
1. 問題由來
背景:團隊使用 Visual Studio 進行跨平臺項目開發。
遇到的問題:
- 編碼:Windows平臺下源代碼文件格式可能是 GBK、IBM866、UTF16LE、UTF-8等等,中文字元串、註釋等跨平臺編譯時出現亂碼;
- 轉碼:Visual Studio 根據源代碼內容、系統區域設置(即本地化)自動確定源代碼編碼格式,含中文字元時存在不確定性;代碼中英字元串處理時需要格式來迴轉換,例如 ANSI->UTF8,無法統一;
- 規範:由於團隊成員個人 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 本地化自動判斷,避免手動更改編碼格式。該問題在一個回答中找到了靠譜的解決方法(
)。即通過一個可移植、可定製的文本編輯器配置文件 .editorconfig 對編輯器進行配置,以下引用回答內容:Visual Studio supports EditorConfig files (
)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
根據 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 支持的特性
,或 。如何將已有文件轉碼:實現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.
2.
3.
4.
5.
6.
7.
轉載請註明原文鏈接:https://www.cnblogs.com/mechanicoder/p/16894144.html