最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

字符亂碼問(wèn)題詳解

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

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

編碼字符集

編碼字符集是所有字符以及對(duì)應(yīng)代碼值的集合。編碼字符集中的每個(gè)字符都對(duì)應(yīng)一個(gè)唯一的代碼值。常見的編碼字符集:ASCII字符集、GBXXXX字符集、BIG5字符集、Unicode字符集等。

字符編碼方式

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

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

源字符集: 源文件字符集是指源文件保存時(shí)按源字符集編碼方式編碼后的字符集。VS2019源字符集編碼格式默認(rèn)是GBK格式,在利用VS編寫代碼時(shí),源代碼會(huì)自動(dòng)編碼為GBK字符集。

執(zhí)行字符集: 程序運(yùn)行時(shí)所使用的字符集,編譯器會(huì)將源字符集先按照源字符集編碼方式進(jìn)行解碼,再將解碼后得到的字符按照?qǐng)?zhí)行字符集編碼方式編碼為執(zhí)行字符集。執(zhí)行字符集一般默認(rèn)使用Windows系統(tǒng)本地字符編碼,若是簡(jiǎn)體中文系統(tǒng),則是GBK或GB2312字符集。

2 字符亂碼原因

在編程中我們給某個(gè)函數(shù)輸入中文字符串的時(shí)候,在運(yùn)行的時(shí)候中文字符串往往就會(huì)變成亂碼,這是因?yàn)榫幋a方式與解碼方式不一致造成的。

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

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

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

為什么英文字符就不會(huì)出現(xiàn)亂碼現(xiàn)象呢?

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

3 字符亂碼解決方案

(1)使用QStringLiteral宏

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

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

QStringLiteral宏它只能處理常量。

(2)使用fromLocal8Bit()函數(shù)

fromLocal8Bit是Qt 中QString 類的一個(gè)成員函數(shù),用于將使用本地編碼的字符串轉(zhuǎn)換為 QString 對(duì)象的內(nèi)部 Unicode編碼。

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

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

使用下面的這兩個(gè)方法可以解決這種問(wèn)題。

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

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

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

(4)使用u8關(guān)鍵字

C++17到來(lái)后出現(xiàn)了u8關(guān)鍵字,表示一個(gè)字符串的可執(zhí)行字符集編碼方式是UTF-8編碼

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

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

相關(guān)文章

  • Qt項(xiàng)目打包的實(shí)現(xiàn)步驟

    Qt項(xiàng)目打包的實(shí)現(xiàn)步驟

    本文主要介紹了Qt項(xiàng)目打包的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C語(yǔ)言中結(jié)構(gòu)體和共用體實(shí)例教程

    C語(yǔ)言中結(jié)構(gòu)體和共用體實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中結(jié)構(gòu)體和共用體的相關(guān)資料,結(jié)構(gòu)體是一種自定義的復(fù)合數(shù)據(jù)類型,共用體也叫聯(lián)合體,使幾個(gè)不同類型的變量共占一段內(nèi)存(相互覆蓋),需要的朋友可以參考下
    2021-06-06
  • C語(yǔ)言線性代數(shù)算法實(shí)現(xiàn)矩陣示例代碼

    C語(yǔ)言線性代數(shù)算法實(shí)現(xiàn)矩陣示例代碼

    這篇文章主要為大家介紹了使用C語(yǔ)言線性代數(shù)的算法來(lái)實(shí)現(xiàn)矩陣示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • C++高精度計(jì)時(shí)的幾種方法總結(jié)(測(cè)試函數(shù)運(yùn)行時(shí)間)

    C++高精度計(jì)時(shí)的幾種方法總結(jié)(測(cè)試函數(shù)運(yùn)行時(shí)間)

    本文介紹了C++中常用的幾種程序計(jì)時(shí)方法,包括clock()函數(shù)、GetTickCount()、QueryPerformanceCounter()以及C++11中的chrono庫(kù)函數(shù),這篇文章主要介紹了C++高精度計(jì)時(shí)的幾種方法,需要的朋友可以參考下
    2024-09-09
  • VSCode之CMake使用小結(jié)

    VSCode之CMake使用小結(jié)

    本文主要介紹了VSCode之CMake使用小結(jié),文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • C語(yǔ)言:十進(jìn)制,BCD碼互換詳解

    C語(yǔ)言:十進(jìn)制,BCD碼互換詳解

    這篇文章主要介紹了C語(yǔ)言十進(jìn)制,BCD碼互換實(shí)例,小編覺(jué)得這篇文章寫的還不錯(cuò),實(shí)例簡(jiǎn)單明了,需要的朋友可以參考下
    2021-09-09
  • VC實(shí)現(xiàn)對(duì)話框窗口任意分割

    VC實(shí)現(xiàn)對(duì)話框窗口任意分割

    最近寫MFC的程序,想在對(duì)話框里實(shí)現(xiàn)窗口的任意分割?,F(xiàn)在網(wǎng)絡(luò)資料一大抄,找個(gè)東西實(shí)在麻煩??偹氵@個(gè)很簡(jiǎn)單,很快就搞定了,寫下來(lái)做個(gè)筆記。
    2015-06-06
  • C++中I/O模型之select模型實(shí)例

    C++中I/O模型之select模型實(shí)例

    這篇文章主要介紹了C++中I/O模型的select模型,實(shí)例講述了I/O模型的用法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C++使用HDF5庫(kù)實(shí)現(xiàn)將h5圖像轉(zhuǎn)為tif格式

    C++使用HDF5庫(kù)實(shí)現(xiàn)將h5圖像轉(zhuǎn)為tif格式

    這篇文章主要為大家詳細(xì)介紹了C++ 語(yǔ)言如何通過(guò)hdf5庫(kù)與gdal庫(kù)實(shí)現(xiàn)將.h5格式的多波段HDF5圖像批量轉(zhuǎn)換為.tif格式,有需要的可以參考一下
    2024-12-12
  • C/C++如何獲取當(dāng)前系統(tǒng)時(shí)間的實(shí)例詳解

    C/C++如何獲取當(dāng)前系統(tǒng)時(shí)間的實(shí)例詳解

    這篇文章主要介紹了 C/C++如何獲取當(dāng)前系統(tǒng)時(shí)間的實(shí)例詳解的相關(guān)資料,這里提供了幾種實(shí)現(xiàn)方法,幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-08-08

最新評(píng)論

中宁县| 星子县| 永善县| 阳春市| 东至县| 灵寿县| 荔浦县| 河南省| 互助| 阿拉善左旗| 马边| 准格尔旗| 白山市| 都匀市| 城市| 雅江县| 寻甸| 泽普县| 房山区| 凌源市| 江西省| 潜山县| 建昌县| 肇源县| 汝城县| 麻栗坡县| 莆田市| 大宁县| 克拉玛依市| 西丰县| 财经| 彭阳县| 台东市| 澄迈县| 陆丰市| 罗田县| 铜陵市| 诏安县| 长顺县| 明光市| 庄浪县|