C 中關於文字編碼的問題

2021-06-18 23:02:27 字數 1183 閱讀 5580

tchar tmptext[50];

sprintf(tmptext,"%d,%d", a, b);

textout(hdc, x, y, tmptext,lstrlen(tmptext));

char與wchar_t

char中存放的是多位元組型的字元,wchar_t中存放的是雙位元組型的字元,tchar在定義了_unicode時等同於wchar_t,在未定義_unicode時等同於char。

sprintf、wsprintf、_stprintf

sprintf是c++執行時庫中的乙個函式。c++ 執行時庫處理字串的函式通常都有2個版本,乙個處理多位元組型的字元,乙個處理雙位元組型的字元。對於sprintf來說,它本身用於處理單位元組字元,其雙位元組字元版本名為wprintf。

為了使用方便,c++執行時庫還為每個處理字串的庫函式定義了乙個巨集,sprintf對應的巨集的名字為_stprintf,這個巨集在定義了_unicode時等同於wsprintf,在未定義_unicode時等同於sprintf。

問題本身

sprintf處理單位元組字元,它就只能接收char型別的字串。所以,如果當前定義了_unicode巨集,那麼tmptext中的字元的型別就是wchar_t. 它就不能傳給sprintf.

要使第二行**沒有問題,要麼把tchar換成char,要麼把sprintf換成tsprintf。由於textout接收tchar型別的字串,所以不能將tchar換成char,那只能把sprintf換成tsprintf。 sprintf換成tsprintf後,其第二個引數也需要加上_t()巨集,以便將其轉換為tchar型別。修改結果如下:

tchar tmptext[50];

_stprintf(tmptext,_t("%d,%d"), a, b);

textout(hdc, x, y, tmptext,lstrlen(tmptext));

如果專案中沒有定義_unicode巨集,那麼整段**就可以通過編譯。但是這樣的寫法是有問題的,應該將**改為:

char tmptext[50];

sprintf(tmptext,"%d,%d", a, b);

textout(hdc, x, y, tmptext,lstrlen(tmptext));

關於字串,推薦你看一下這兩篇文章:

Qt中關於中文字元編碼問題

qstring filepath filepath qfiledialog getopenfilename null,qstring 開啟戶型圖 qstring qstring 戶型 件 bmp jpg png 編譯器報如下錯誤 e qt projects huxing src mainwindow...

關於文字的編碼

我們知道在計算機中儲存的都是0和1的二進位製碼,那怎麼用這些數字來表達我們通常用的字元呢?人們通過編碼的方式人為的規定了用特定的數字對應特定的字元。這就是編碼。計算機是在歐洲發明的,剛開始就只有歐洲人使用,他們為了在計算機上表示他們常用的字元美國制定了ascii碼表,因為它們的字元比較少 ascii...

關於文字編碼

原始檔用不同的編碼方式編寫,會導致 的執行結果不同。用ue編輯文件時,可以使用快捷鍵 ctrl h 檢視文字的字元編碼 可以設定顯示什麼編碼,acii碼 gbk big5 unicode等 在編譯程式時,可以指定字符集,檢視幫助資訊 man gcc,charset finput charset ch...