1. 程式人生 > >中文QString轉成char型別中造成亂碼的原因

中文QString轉成char型別中造成亂碼的原因

QString內部採用的是unicode編碼,但是unicode編碼有很多種,在實際應用時應制定具體的編碼形式,常見的有GBK、GB2312和UTF-8等。

UTF-8是解決國際上字元的一種多位元組編碼,它包含全世界國家所用到的所有字元,通用性強。英文單位元組表示,中文需要三個位元組表示。

GBK是國家標準GB2312基礎上擴容後併兼容GB2312標準,無論英文中文都用雙位元組來表示。GBK包含全部中文字元,是中文國家標準的一種編碼方式。GB2312是簡體中文的碼,GBK則支援簡體中文和繁體中文。

指定unicode的編碼方式一般採用的方法是在main函式中新增如下語句:

QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));

QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));

此處指定unicode編碼方式為GBK編碼;

QString轉換char操作為

QString path("我是漢字");

QByteArray cpath = path.toLocal8Bit();  注意,這個QByteArray 物件一定要建立

char *p = cpath.data();

此時便完成了中文QString到char型別的轉換。但是我們單步執行程式,從除錯視窗中觀察char中的資料,發現不是”我是漢字“,而是亂碼"ÎÒÊǺº×Ö"

這時,我們就會懷疑我們的轉換沒有成功,其實不然。因為在我們當前所用的QT軟體介面中所顯示的內容是採用latin編碼後的結果,而我們的QString類中的內容”我是漢字“當前採用的是GBK編碼,編碼結果為ce d2 ca c7 ba ba d7 d6,而這八個位元組的資料在latin中就是亂碼"ÎÒÊǺº×Ö",我們將cpath物件展開可看到這八個位元組的資料正是ce d2 ca c7 ba ba d7 d6,所以轉換正確。

相關推薦

中文QStringchar型別造成亂碼原因

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

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

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

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(&

QTQString到string型別

std::string QString::toStdString() const Returns a std::string object with the data contained in this QString. The Unicode data is conve

mysql資料庫日期Stringdatetime型別作比較

在我們日期作為條件查詢時,通常前端傳過來的可能是String=‘2019-03-06’,這樣的日期格式。那麼在傳入後臺和datetime作比較時可以轉換如下格式: <if test="beginTime != null and beginTime != '

StringDate型別,操作年月加減

public static void main(String[] args) { String date1 = "2017-07-30";           DateFormat df = new SimpleDateFormat("yy

跨平臺實現wchar_tchar

    *pc++ = *pw >> 8 ;     *pc = *pw ;     return 0 ; }   char *wstr2cstr(const wchar_t *pwstr , char *pcstr, size_t len) {  char *ptemp = pcstr ;  

php 將中文字串漢語拼音

功能:將中文字串轉換成漢語拼音,支援簡體、繁體、中英混合,首字母大寫 類庫:Pinyin.class.php 用法: $str = '我愛中國'; $pinyin = new Pinyin(); echo $pinyin->get($str); 結果為:Wo Ai Z

springMVC返回json資料時date型別資料被long型別

在專案的過程中肯定會遇到ajax請求,但是再用的過程中會發現,在資料庫中好好的時間型別資料:2017-05-04 17:52:24 在轉json的時候,得到的就不是時間格式了 而是145245121這

解決nginx在記錄post資料時 中文字元16進位制的問題

1. 問題描述nginx 在獲取post資料時候,如果是中文,則轉換成16進位制顯示在日誌檔案中,如下圖所示。Paste_Image.png日誌格式為: log_format postdata '$remote_addr | $request_body | $resp_body';此篇文章記錄下解決此次問題的

Android讀取檔案時,由byteString字串時出現亂碼

先看看出亂碼的程式碼 public static void getInfo(Context context) { try { FileInputStream

js檔案中文提示資訊發到jsp出現亂碼解決步驟

.js檔案建立預設是gbk編碼,該js檔案中如果有中文,在utf-8的jsp頁面中,顯示改中文,為亂碼! 解決方法: 1--將原來.js檔案中的內容全部複製到剪貼簿中; 2--修改js檔案的編碼格式為utf-8; 3--將剪貼簿中的內容黏貼到原來的js檔案覆蓋原有內

javachar型別轉換int型別

PlanA: char ch = '9'; if (Character.isDigit(ch)){ // 判斷是否是數字 int num = Integer.parseInt(String.valueOf(ch)); System.out.println(num); }

MFCTCHAR和CHAR型別的互

//將TCHAR轉為char    //*tchar是TCHAR型別指標,*_char是char型別指標    TcharToChar (const TCHAR * tchar,&n

Python 讀取檔案unicode編碼中文顯示問題

Python讀取檔案中的字串已經是unicode編碼,如:\u53eb\u6211,需要轉換成中文時有兩種方式 1.使用eval eval("u"+"\'"+unicodestr+"\'") 2.使用decode: str1 = '\u4f60\u

DateTime型別獲取DayOfWeek時的英文如何轉換中文

1.這是一種最笨的方法 int   i=(int)DateTime.Today.DayOfWeek;     switch(i)     {             case   0:                         txtDate.Text="星期天";  

QT QString char* 中文亂碼問題

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

java 將字串含有unicode 中文

private static String ascii2native ( String asciicode )     {         String[] asciis = asciicode.split ("\\\\u");         String nativeV

把列表的unicode中文。用於jinja2的渲染

在python 下面一個包含中文字串的列表(list)或字典,直接使用print會出現以下的結果: 1 2 3 dict = {"asdf": "我們的python學習"} print dict {'asdf': '\xe6\x88\x91\xe4

java 從mysql的integer時間類型

edate close 技術 上架 bsp net code util first Date nedate = new Date(); DateFormat dateformat = new SimpleDateFormat("yyy-MM-dd HH