1. 程式人生 > >QT QString 轉 char* 中文亂碼問題

QT QString 轉 char* 中文亂碼問題

最近,QT專案遇到這樣一個問題

    1.將某個 QString 變數轉換成 char * 變數。

    2.將char * 變數 轉換成 QString 。

然後,測試發現,如果第一步的QString含中文,那麼,得到的char * 變數就會亂碼。

部分程式碼如下:

main()函式中設定編碼:

QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf-8"));

將QString轉換成char * 過程:

QString str = "中文測試";
QByteArray temp = str.toLocal8bit();
char *name = temp.data();
qDebug()<<"name: "<<name;

執行後的列印的結果顯示是亂碼的。

解決方法

方法一:先將QString轉換為標準庫中的string型別,然後將string轉換為char*,如下:

std::string str = filename.toStdString();
const char* ch = str.c_str();

經測試,沒有出現中文亂碼。

方法二:Qt中,很多時候,我們用 char*  ch 變數去顯示到介面時,都會先將其轉換成QString。如果直接使用強轉換QString(ch),得到的結果會是亂碼。但是,使用如下方法轉換即可解決問題,程式碼如下:

1.設定編碼:

QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf-8"));
2.將QString轉換成char * 過程:
QString str = "中文測試";
QByteArray temp = str.toLocal8Bit();
char *name = temp.data();
qDebug()<<"name: "<<name;

儘管此時qDebug()輸出顯示的是亂碼,但是假如這裡的name 只是作為一箇中間變數,是為了呼叫某些介面而使用的,最後還是需要將 name 轉換會 QString 供介面顯示。那麼我們可以忽略這個name變數的亂碼問題,只需要關注:最後將name轉換為QString時,不會亂碼就行。

3.將char* 轉換為 QString

char name[256];
memset(name,0,sizeof(name));
getFileName(name); //從某個地方獲取name,自定義
QString str = QString::fromLocal8Bit(name);  //轉換成QString,供介面顯示。
                                             //此處如果直接使用強制轉換QString str = QString(name),會出現亂碼。

所以,關鍵在於 toLocal8Bit() 以及 fromLocal8Bit() 的配套使用。

相關推薦

QT QString char* 中文亂碼問題

最近,QT專案遇到這樣一個問題:    1.將某個 QString 變數轉換成 char * 變數。    2.將char * 變數 轉換成 QString 。然後,測試發現,如果第一步的QString含中文,那麼,得到的char * 變數就會亂碼。部分程式碼如下:main(

Qt QStringchar*

str bsp array 標準 cst data ray 轉換 string 一、QString str; char *ch; QByteArray ba = str.toLatin1(); ch = ba.data(); 二、將QSt

Qt設定為GBK/System編碼時,QStringchar*亂碼問題

這個問題以前遇到過,結果後來忘了,今天遇到中文路徑用FILE寫檔案,結果檔名亂碼。 (我服了,這個破線上編輯器,幾段文字我格式折騰半天,還把網頁卡死兩次)。 錯誤方式: //QString str=QString::fromLocal8Bit("

[坑]QtQStringchar*

Qt下面,字串都用QString,確實給開發者提供了方便,想想VC裡面定義的各種變數型別,而且函式引數型別五花八門,經常需要今年新那個型別轉換 Qt再使用第三方開源庫時,由於庫的型別基本上都是標準的型別,字串遇的多的就是Char*型別 在Qt下怎樣將QString轉char*呢,需要用到QByteArray

[qt]qstring和string中文支持轉換問題

style class from 問題 () cdata bsp .data bytearray QString str2qstr(const string str) { return QString::fromLocal8Bit(str.data()); }

java htmlpdf 中文亂碼

網上關於 html生產pdf的java程式碼許多,我就不說了。主要是記錄一下亂碼問題的關鍵 1、html檔案必須是utf-8編碼格式的檔案。 2、程式碼中的獲取方式也是utf-8的格式。 3、其他的按照別人的教程編寫

關於QT,C++,MySQL之間中文亂碼問題的簡單解決

中文編碼之殤 上學期用QT和VS寫了一個圖書管理系統的大作業,本學期要求用C++寫一個電商平臺,於是我重操舊業又開始搞起QT+VS,由於這次老師沒限制資料庫的使用,本著探索求知的精神,我開始了我的踩坑之旅。 第一大敵的就是中文編碼問題,回想起上學期的慘痛

前端h5頁面傳參跳中文亂碼問題

關係 A介面------B介面-------A介面 點選A介面中的觸發事件(例如btn按鈕),跳轉到B頁面選擇資料, 點選B頁面的按鈕,攜帶B頁面引數到A頁面 A頁面:js程式碼 //執行GetRequest() 函式,處理頁面傳參中文亂碼問題 $(fu

QT中使用MYSQL中文亂碼解決方法(Linux)

1.在QT程式的main.cpp的main函式中QTextCodec```那三句: int main(int argc, char *argv[]) { QApplication a(argc, argv); QTextCodec *codec =

【ubuntu linux】 QT中使用MYSQL中文亂碼解決方法

其實這篇文章是整合版,是借鑑網上兩篇文章整合起來的。 先給出兩篇源文章的來源: 第一篇是講mysql資料庫編碼的,而我採用成功的方法是第二篇的。 推薦你先試一下第二篇文章,如果成功了,就不用往下看了。 產生中文亂碼的原因:QT預設的傳送和接受都是UTF-8編碼的,而

Qt寫c++控制檯中文亂碼問題

    我遇到的情況:     檔案編碼為UTF-8。程式輸輸出中文位亂碼。     解決方案:     1. 工具->選項->環境->語言: Chinese     2. 選項->文字編輯器->行為->檔案編碼->預設編碼: Sy

linux下java中的icepdfimg中文亂碼

專案在win10下是正常執行的,但是放到linux下Pdf轉的IMG中中文全部亂碼:解決方法:到C:\Windows\Fonts 下拷貝自己想要的字型在linux下的 /usr/share  下找到fonts資料夾,如果沒有找到,那就新建。進入fonts目錄,再新建資料夾,名

中文QStringchar型別中造成亂碼的原因

QString內部採用的是unicode編碼,但是unicode編碼有很多種,在實際應用時應制定具體的編碼形式,常見的有GBK、GB2312和UTF-8等。 UTF-8是解決國際上字元的一種多位元組編碼,它包含全世界國家所用到的所有字元,通用性強。英文單位元組表示,中文

關於 stringconst char* 過程中中文亂碼問題,GDAL

剛開始用GDAL,輸出路徑 是由string轉到const char*的,但發現漢字總是亂碼,比較懵逼,第一次遇見這種問題,除錯模式下程式碼神奇的跟不進去,顯示找不到檔案之類的,  ,查了近兩個小時,一直以為是環境錯了或者庫有問題,最後經過多次排查才發現是GDAL預設不支援中

Unicode字符集下CString與char *轉換 (解決中文亂碼等)(

1、Unicode下CString轉換為char * 方法一:使用API:WideCharToMultiByte進行轉換              CStringstr = _T("D:\\校內專案\\QQ.bmp");             //注意:以下n和l

QT型別轉換 QStringconst char*,QStringu_short

QString str; bool ok; const char* ch=str.toAscii().constData(); u_short us=str.toUShort(&ok,10);//10表示10進位制 u_short us=str.toUShort(&

解決linux/Ubuntu下Qt creater 介面程式在編譯執行後無法顯示中文中文亂碼問題(

本文解決的主要是介面程式編譯執行後無法顯示中文的問題,如果在creater 中無法輸入中文,下載個IBus或者搜狗之類的中文輸入法即可解決! 首先說亂碼問題,這個很好解決: 如果是在Linux下開啟Windows下的專案出現亂碼,選擇編碼為“GB2312”即可! 現在主要

web之ajax(一)---使用表單的serialize()方法中文亂碼解決

ack track 獲取 enc uri clas serialize post class 有時候我們須要使用ajax提交去提交form的值,這樣就須要使用serialize()去獲取form的值。但這樣獲取的值假設有中文

兩個頁面跳中文參數,中文出現亂碼解決方法

ber dex arm1 ring ces lin cat 兩個 .html // encodeURI 編碼 window.location.href(encodeURI("zhongji2.html"+"?"+"parm1="+parm1+"&parm2="+pa

編碼(ACSII unicod UTF-8)、QT輸出中文亂碼深入分析

們的 解決方法 ces size 虛擬 類型 col 機器 編碼規則 總結: 1. qt輸出中文亂碼原因分析 qt的編程環境默認是utf-8編碼格式(關於編碼見下文知識要點一); cout << "中文" << endl; 程序運行,程序並不認識