VS2022 + Qt5.9 中文亂碼/項目設置utf-8編碼

🛠? 解決QT5.9 + VS2022中文亂碼的全面方案

📁 1. 檢查文件編碼與編譯器設置

確保源文件是 帶BOM的UTF-8 編碼對MSVC編譯器很重要。VS2022默認可能使用本地編碼(如GB2312)解析源文件,即使文件以UTF-8保存。

  • 查看和設置文件編碼:在VS2022中,可以通過 “文件” -> “高級保存選項” 來確認和設置當前文件的編碼為 “Unicode (UTF-8 帶簽名) - 代碼頁 65001”。如果“文件”菜單中沒有“高級保存選項”,可以通過 “工具” -> “自定義” -> “命令” -> “菜單欄” 選擇“文件”,點擊“添加命令”,在“文件”類別中找到并添加“高級保存選項”。
  • 強制編譯器使用UTF-8:在項目屬性中設置編譯器使用UTF-8編碼。
    • 右鍵點擊項目 -> “屬性”
    • 進入 “配置屬性” -> “C/C++” -> “命令行”
    • “其他選項” 中添加 /utf-8

?? 2. 項目屬性配置

在VS2022中配置項目屬性,以確保從編譯到鏈接各個環節都能正確處理UTF-8編碼。

  1. 右鍵單擊你的Qt項目,選擇 “屬性”
  2. “配置屬性” -> “C/C++” -> “命令行” 的“其他選項”中,添加 /utf-8
  3. 確保你的項目配置文件(如 .vcxproj)中沒有其他字符集相關的沖突設置。

🔧 3. 代碼層面的修改

使用 QStringLiteral

QStringLiteral 宏可以在編譯期將字符串字面量轉換為 QString 對象,并正確處理UTF-8編碼,避免運行時轉換開銷和亂碼問題。

// 修改前
QPushButton* button = new QPushButton(QString("點擊我"), this);// 修改后
QPushButton* button = new QPushButton(QStringLiteral("點擊我"), this);

使用 tr() 函數進行國際化

對于用戶界面中的字符串,建議使用 tr() 函數,它不僅可以標記需要翻譯的字符串,也在一定程度上有助于Qt的字符串處理系統正確識別編碼。

QMessageBox::information(this, QStringLiteral("標題"), tr("你點擊了按鈕"));
// 注意:tr() 函數本身通常用于國際化,其源字符串也需要確保編碼正確。
// 如果使用 tr(), 對應的字符串應出現在 .ts 翻譯文件中,并由 lrelease 工具處理。

顯式指定字符串編碼

如果以上方法仍有問題,可以嘗試使用 QString::fromUtf8() 進行顯式轉換。

QPushButton* button = new QPushButton(QString::fromUtf8("點擊我"), this);
...
QMessageBox::information(this, QString::fromUtf8("標題"), QString::fromUtf8("你點擊了按鈕"));

🌐 4. 設置應用程序默認編碼

main 函數中,設置應用程序的默認編碼為 UTF-8。請注意,在 Qt5 中,QTextCodec::setCodecForLocale 等函數已被棄用,但在某些情況下,明確設置編碼可能仍有幫助。

#include <QApplication>
#include <QTextCodec> // 如果使用Qt5,注意某些函數已棄用int main(int argc, char *argv[])
{QApplication a(argc, argv);// 設置應用程序默認使用 UTF-8 編碼// 在Qt5.9中,以下函數可能可用,但請注意Qt5中這些函數已標記為廢棄// 在Qt6中,這些函數已被移除
#if QT_VERSION <= QT_VERSION_CHECK(6,0,0)QTextCodec *codec = QTextCodec::codecForName("UTF-8");QTextCodec::setCodecForLocale(codec);// 注意:setCodecForCStrings 和 setCodecForTr 在 Qt5 中已移除。
#endif// ... 你的其他代碼 ...return a.exec();
}

重要提醒QTextCodec::setCodecForLocale 在 Qt5 中已廢棄,且在 Qt6 中完全移除。對于新項目,建議優先采用前述方法一和方法二。

📝 用戶代碼修改示例

根據以上建議,你的代碼可以修改為:

// 根據需要包含頭文件,例如可能需要 #include <QTextCodec>QPushButton* button = new QPushButton(QStringLiteral("點擊我"), this);
button->setGeometry(100, 100, 100, 30);
connect(button, &QPushButton::clicked, [=]() {QMessageBox::information(this, QStringLiteral("標題"), QStringLiteral("你點擊了按鈕"));// 如果為了國際化,并且已經配置好翻譯系統,也可以使用 tr()// QMessageBox::information(this, tr("Title"), tr("You clicked the button."));
});

💎 核心解決思路匯總

環節推薦設置注意事項
文件編碼帶BOM的UTF-8在VS2022中通過“高級保存選項”設置。
編譯器設置項目屬性 -> C/C++ -> 命令行 -> 其他選項:/utf-8確保編譯器正確理解源文件編碼。
字符串處理使用 QStringLiteral編譯期創建QString,避免亂碼。
國際化使用 tr() 函數方便后續國際化,并可能減少編碼問題。
應用程序編碼QTextCodec::setCodecForLocale (Qt5)注意:Qt5中已廢棄,Qt6中已移除。僅在必要時使用,并注意兼容性。

希望這些方法能幫助你解決中文亂碼問題。如果在嘗試后問題依舊,或者你在實踐中遇到了其他情況,歡迎隨時告訴我。

VS 里邊安裝插件【Force UTF8】拓展

【無BOM版(推薦)】
https://marketplace.visualstudio.com/items?itemName=hbuexinxin.Fo

rceUTF8NoBOM
【帶BOM版】
https://marketplace.visualstudio.com/items?itemName=jz5.ForceUTF8withBOM-18593

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

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

相關文章

數據庫--MySQL數據管理

數據庫–MySQL數據管理 文章目錄數據庫--MySQL數據管理1.外鍵管理2.數據庫數據管理3.DML語言3.1添加數據3.2修改數據3.3刪除數據4.練習1.外鍵管理 外鍵概念 如果公共關鍵字在一個關系中是主關鍵字&#xff0c;那么這個公共關鍵字被稱為另一個關系的外鍵。由此可見&#xff0c;…

【C++練習】13.C++輸出九九乘法表的方法詳解

目錄 C++輸出九九乘法表的方法詳解 方法1:雙重for循環(最基礎) 思考: 代碼分析: 特點: 方法2:使用while循環 思考: 代碼分析: 特點: 方法3:使用遞歸實現 思考: 代碼分析: 特點: 方法4:格式化輸出(對齊美觀) 思考: 代碼分析: 特點: 方法5:使用函數封裝 思考…

MVC及其衍生

MVC 把軟件分成模型&#xff08;Model&#xff09;、視圖&#xff08;View&#xff09;、控制器&#xff08;Controller&#xff09;三個基本部分。 事實上對應著 Controller——輸入 用戶交互&#xff0c;將輸入處理成Controller能處理的形式 Model——處理 描述狀態、邏輯規律…

微碩WINSOK MOS管WSF3089,賦能汽車轉向系統安全升級

隨著汽車電子化程度不斷提高&#xff0c;轉向系統對高效功率器件的需求日益增長。微碩WINSOK推出的N溝道Trench MOS管WSF3089&#xff0c;以30 V/72 A大電流、4.5 mΩ超低導通電阻和TO-252-2L緊湊封裝&#xff0c;為EPS&#xff08;電動助力轉向&#xff09;電機驅動、電源管理…

淘寶拍立淘接口的接入與應用||item_search_img-按圖搜索淘寶商品(拍立淘)

淘寶拍立淘接口的接入與應用如下&#xff1a;接入流程注冊與認證&#xff1a;開發者賬號注冊&#xff1a;訪問淘寶開放平臺&#xff0c;進行開發者賬號注冊。創建應用&#xff1a;在控制臺創建新應用&#xff0c;獲取 App Key 和 App Secret&#xff0c;這是接口調用的憑證。申…

Python學習-day8 元組tuple

元組&#xff08;Tuple&#xff09;是Python中一種不可變的序列類型&#xff0c;用于存儲多個有序元素。與列表&#xff08;List&#xff09;類似&#xff0c;但元組一旦創建后不能修改&#xff08;不可添加、刪除或修改元素&#xff09;&#xff0c;這使得它在安全性、性能優化…

大數據畢業設計選題推薦-基于大數據的國家醫用消耗選品采集數據可視化分析系統-Hadoop-Spark-數據可視化-BigData

?作者主頁&#xff1a;IT畢設夢工廠? 個人簡介&#xff1a;曾從事計算機專業培訓教學&#xff0c;擅長Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等項目實戰。接項目定制開發、代碼講解、答辯教學、文檔編寫、降重等。 ?文末獲取源碼? 精彩專欄推薦?…

二次學習C語言補充2

文章目錄表棧、隊列、二叉樹一、二叉樹二、表棧三、隊列鏈表一、單向鏈表二、循環鏈表、雙向鏈表和雙向循環鏈表預處理一、預處理二、宏定義文件文件操作補充本篇文章是對二次學習C語言12——文件操作 二次學習C語言14——預處理及模塊化 二次學習C語言15——鏈表 二次學習C語言…

2.9Vue創建項目(組件)的補充

1.再創建和引入vue的選擇2.VsCode插件 安裝Vue自己搜索最新的3.style自己的作用域在一個組件中引入另一個文件的子組件&#xff0c;給當前組件設置樣式&#xff0c;那么子組件的樣式也會改變的。為了解決這個問題 我們在自己的style中設置一個屬性4.另一種創建vue 的方式(主流…

算法高頻題

刷題&#xff1a;LeetCode&#xff08;Top 100-150題&#xff0c;至少刷兩遍&#xff09;。重點&#xff1a;鏈表、樹、二分查找、動態規劃、回溯、棧/隊列。 每一個題型&#xff0c;前10個高頻題 算法思考框架參考&#xff1a;算法題思維框架-CSDN博客 高頻順序參考網站&…

服務器安裝 LDOPE(MODIS 數據處理工具)

目錄下載方式1-&#xff08;簡單快捷&#xff09;根據WRF-VPRM 需要打補丁下載方式2&#xff1a;&#xff08;手動安裝依賴&#xff09;一、安裝所需依賴庫&#xff08;4 個主庫 2 個基礎庫&#xff09;另- HDF-EOS 手動編譯二、解壓并安裝 LDOPE參考下載方式1-&#xff08;簡…

克隆代幣 + 捆綁開盤:多鏈環境下的低成本發幣玩法

在加密世界&#xff0c;發幣已經不再是“少數開發者的專利”。隨著工具的普及&#xff0c;任何人都可以快速發行一個在加密世界&#xff0c;發幣已經不再是“少數開發者的專利”。隨著工具的普及&#xff0c;任何人都可以快速發行一個代幣。但問題是&#xff1a;如何在保證低成…

數據結構中的 二叉樹

1.前言 在 Java 中&#xff0c;樹&#xff08;Tree&#xff09;是一種非線性數據結構&#xff0c;由節點&#xff08;Node&#xff09;組成&#xff0c;常見的線性表則是我們之前學過的順序表、鏈表、棧、隊列等等。每個節點包含數據和指向子節點的引用。樹的常見實現方式包括二…

IntelliJ IDEA 啟動項目時配置端口指南

&#x1f31f; 一、為什么需要手動設置啟動端口&#xff1f; 默認情況下&#xff0c;Spring Boot 應用會使用 8080 端口啟動。但在以下場景中&#xff0c;我們必須自定義端口&#xff1a; 多個微服務同時運行&#xff0c;需避免端口沖突&#xff1b;團隊協作開發&#xff0c;統…

spark sql之from_json函數

目錄前言函數語法參數說明返回值案例案例1案例2前言 在Spark SQL中&#xff0c;from_json函數用于解析包含JSON字符串的列&#xff0c;并將其轉換為Spark SQL的結構化類型&#xff08;如struct、map或array&#xff09; 函數語法 from_json(jsonStr, schema [, options])參數…

數據結構 之 【位圖的簡介】

目錄 1.位圖的引入 2.位圖概念 3.位圖的實現 3.1前提準備 3.2set 3.3reset 3.4test 4.位圖的應用 1.位圖的引入 給40億個不重復的無符號整數&#xff0c;沒排過序 再給一個無符號整數&#xff0c;如何快速判斷這個無符號整數是否在 這40億個數中 首先&#xff0c;一個…

[iOS] ViewController 的生命周期

文章目錄前言一、UIViewController 生命周期有關函數二、UIViewController 中函數的執行順序運行結果1.present和dismiss2.push和pop三、總結前言 UIViewController 是在 iOS 開發中一個非常重要的角色&#xff0c;他是 view 和 model 的橋梁&#xff0c;通過 UIViewControlle…

第30章 零售與電商AI應用

本章將深入探討人工智能在零售與電商領域的革命性應用。我們將從智能推薦系統、動態定價、庫存管理到創新的虛擬試衣間&#xff0c;全面解析AI如何重塑購物體驗和商業運營效率&#xff0c;并為每個關鍵技術點提供代碼實戰&#xff0c;幫助你掌握將AI應用于真實商業場景的能力。…

QT通過QModbusRtuSerialMaster讀寫電子秤數據實例

一、電子稱常用功能&#xff1a;稱重、清零、去皮&#xff1b;電子秤的通訊方式&#xff1a;Modbus通信、串口通信。二、QT讀寫電子秤軟件界面如下&#xff1a;三、核心代碼如下&#xff1a;.pro項目文件代碼&#xff1a;QT core gui serialbus serialport.h頭文件代碼#…

sqlmap常用命令

ZZHow(ZZHow1024) 一、掃描注入點 1.GET方法&#xff0c;給URL&#xff1a; #探測該url是否存在漏洞 python sqlmap.py -u "http://192.168.10.1/sqli/Less-1/?id1"#如果我們已經知道admin這里是注入點的話&#xff0c;可以在其后面加個*來讓sqlmap對其注入 python …