欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

VS+QT編譯環(huán)境中字符亂碼問題解決方法

 更新時間:2024年01月22日 11:05:30   作者:北冥有魚丶丶  
編碼就是把?個字符編碼成二進制碼存起來的方式,而解碼就是把這個二進制碼按照原本編碼的規(guī)則還原成原來的字符,這篇文章主要介紹了VS+QT編譯環(huán)境中字符亂碼問題詳解,需要的朋友可以參考下

字符亂碼問題詳解

在解釋字符亂碼問題之前,我們需要先理清一些基本概念

1 編碼字符集與字符編碼方式

編碼字符集

編碼字符集是所有字符以及對應代碼值的集合。編碼字符集中的每個字符都對應一個唯一的代碼值。常見的編碼字符集:ASCII字符集、GBXXXX字符集、BIG5字符集、Unicode字符集等。

字符編碼方式

編碼字符集中只規(guī)定了字符的代碼值并未規(guī)定具體如何存儲,字符編碼方式解決了字符在計算機中如何存儲的問題,它是將編碼字符集中的字符代碼值轉換為實際的存儲字節(jié)序列的一種映射規(guī)則。常見字符編碼方式:ASCII編碼、GBXXXX編碼、BIG5編碼、UTF-8編碼、UTF-16編碼、UTF-32編碼等。每種編碼字符集至少對應一種字符編碼方式,也可以對應多種編碼方式。

什么是字符的編碼與解碼?
編碼就是把?個字符編碼成二進制碼存起來的方式,而解碼就是把這個二進制碼按照原本編碼的規(guī)則還原成原來的字符。

源字符集: 源文件字符集是指源文件保存時按源字符集編碼方式編碼后的字符集。VS2019源字符集編碼格式默認是GBK格式,在利用VS編寫代碼時,源代碼會自動編碼為GBK字符集。

執(zhí)行字符集: 程序運行時所使用的字符集,編譯器會將源字符集先按照源字符集編碼方式進行解碼,再將解碼后得到的字符按照執(zhí)行字符集編碼方式編碼為執(zhí)行字符集。執(zhí)行字符集一般默認使用Windows系統本地字符編碼,若是簡體中文系統,則是GBK或GB2312字符集。

2 字符亂碼原因

在編程中我們給某個函數輸入中文字符串的時候,在運行的時候中文字符串往往就會變成亂碼,這是因為編碼方式與解碼方式不一致造成的。

例:
VS+QT編譯環(huán)境中,如果直接將中文字符串傳給QT函數時,會出現亂碼:

QString s("你好");//亂碼
qDebug() << "路漫漫其修遠兮";//亂碼

原因在于這些中文字符串被GBK編碼為源字符集,編譯器會先采用GBK將這被GBK編碼的源字符集解碼,再用GB2312編碼為執(zhí)行字符集,而Qt5內部采用Unicode字符集,UTF-16編碼,QT中的函數會將執(zhí)行字符集使用UTF-8解碼,再使用UTF-16編碼為unicode字符集,QString內部使用UTF-8對執(zhí)行字符集進行解碼的時候,與執(zhí)行字符集編碼格式不一致,肯定會出現亂碼現象。

為什么英文字符就不會出現亂碼現象呢?

英文字符通常都是ASCII字符編碼,常見的字符編碼都會以某種形式“兼容”ASCII編碼,而我們接觸比較多的UTF-8和GBK則是完全兼容ASCII,也就是ASCII編碼的數據,在UTF-8、GBK中會是一樣的數字形式(一個字節(jié))。即
AB在ASCII編碼中對應的是0x41和0x42,在GB2312和UTF-8中還是0x41和0x42,所以對于AB這兩個字符用GB2312編碼為0x41和0x42后,采用UTF-8再進行解碼,得出來的仍然是AB,所以不會出現亂碼。

3 字符亂碼解決方案

(1)使用QStringLiteral宏

從“字符串常量”創(chuàng)建QString對象

qDebug() << QStringLiteral("路漫漫其修遠兮");

QStringLiteral宏它只能處理常量。

(2)使用fromLocal8Bit()函數

fromLocal8Bit是Qt 中QString 類的一個成員函數,用于將使用本地編碼的字符串轉換為 QString 對象的內部 Unicode編碼。

qDebug() << QString::fromLocal8Bit("路漫漫其修遠兮");

使用QStringLiteral宏和fromLocal8Bit()函數輸出的字符串還帶有雙引號:

使用下面的這兩個方法可以解決這種問題。

(3)使用#pragma execution_character_set(“utf-8”)

源程序中加上如下指令,將源文件的可執(zhí)行字符集編碼方式設置為utf-8

#pragma execution_character_set("utf-8")
 qDebug() << "路漫漫其修遠兮";

(4)使用u8關鍵字

C++17到來后出現了u8關鍵字,表示一個字符串的可執(zhí)行字符集編碼方式是UTF-8編碼

qDebug() << u8"路漫漫其修遠兮"

到此這篇關于VS+QT編譯環(huán)境中字符亂碼問題詳解的文章就介紹到這了,更多相關VS QT字符亂碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C/C++宏定義的可變參數詳細解析

    C/C++宏定義的可變參數詳細解析

    在1999年版本的ISO C 標準中,宏可以象函數一樣,定義時可以帶有可變參數。宏的語法和函數的語法類似
    2013-09-09
  • C++面向對象實現萬年歷的示例代碼

    C++面向對象實現萬年歷的示例代碼

    本文將通過面向對象實現一個簡單的日歷(萬年歷)效果,主要會有以下幾個模塊:模型、視圖、控制,感興趣的小伙伴可以動手嘗試一下
    2022-06-06
  • visual studio 建立dll類型工程、控制臺程序

    visual studio 建立dll類型工程、控制臺程序

    這篇文章主要介紹了visual studio 建立dll、控制臺類型工程的相關知識,感興趣的朋友跟隨腳本之家小編一起學習吧
    2018-05-05
  • C++實現神經BP神經網絡

    C++實現神經BP神經網絡

    這篇文章主要為大家詳細介紹了C++實現神經BP神經網絡,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C語言實現多線程定時器實例講解

    C語言實現多線程定時器實例講解

    在本篇文章里小編給各位分享的是一篇關于C語言實現多線程定時器實例講解內容,有需要的朋友們可以參考學習下。
    2021-01-01
  • C語言通過gets和gets_s分別實現讀取含空格的字符串

    C語言通過gets和gets_s分別實現讀取含空格的字符串

    在遇到包含空格的字符串輸入時該如何讀取呢?如果使用scanf以%s格式去讀取輸入的字符串,遇到空格就讀取結束了,顯然這樣是讀取不了的。本文就將介紹兩個可以對含空格字符串讀取的庫函數------gets和gets_s函數,感興趣的可以了解一下
    2021-12-12
  • C++ Qt開發(fā)之PushButton按鈕組件的使用詳解

    C++ Qt開發(fā)之PushButton按鈕組件的使用詳解

    Qt 是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應用程序,本文將重點介紹QPushButton按鈕組件的常用方法及靈活運用,感興趣的小伙伴可以學習一下
    2023-12-12
  • 在C++中反射調用.NET的方法(一)

    在C++中反射調用.NET的方法(一)

    為什么要在C++中調用.NET呢?接下來通過本文給大家介紹在C++中反射調用.NET的方法(一),需要的朋友參考下吧
    2017-02-02
  • C++11/14 線程調用類對象和線程傳參的方法

    C++11/14 線程調用類對象和線程傳參的方法

    這篇文章主要介紹了C++11/14 線程調用類對象和線程傳參的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • 詳解數據結構C語言實現之循環(huán)隊列

    詳解數據結構C語言實現之循環(huán)隊列

    在我們生活中有很多隊列的影子,可以說與時間相關的問題,一般都會涉及到隊列問題;本文詳細介紹了如何使用C語言實現循環(huán)隊列,下面一起來看看。
    2016-07-07

最新評論