WCHAR我不再懼怕了

2021-06-13 05:27:03 字數 2418 閱讀 3563

寬字元已經困擾我很久了,以前我都是設定專案的屬性把它改為多位元組,不用unicode。不過現在又遇到寬位元組的問題,沒有辦法,只有硬著頭皮學學:

我找到的資料:

看了之後我才發現原來有wcs***的函式專門處理寬位元組的,就是str***一樣好使。呵呵,我不再懼怕了,就試著自己寫了一下,還是學了蠻多東西的:

1.有wcs***的函式和str***的函式對應處理寬位元組,wcslen就是求長度的,wcscmp就是比較兩個字串的。

2.輸出也有相關的操作,wprintf(l」%s%s」);這樣的操作,對檔案也可以用fwprintf函式來輸出。不過我發現貌似cout << wchar;不成功。也發現了乙個問題,就是我輸出」相等」這樣乙個字串的時候,發現居然輸出不正確,無論是控制台和檔案都有錯誤。可見,這個還是有點小問題的。輸出其他的例如」12345」等都是正常的。哎,這個函式並不可靠啊。

3.寬位元組和普通串的轉換問題,學了兩個函式,乙個是:

wcstombs(char* strdes, const wchar*, size_t nmax);這個函式的作用是把wchar轉換為char。

char* strdes 為儲存轉換後的普通字串,wchar* 要被轉換的寬字串。轉換的最大長度。這裡的長度是轉換的個數,而不是位元組長度。

mbstowcs() 就是乙個相反的過程了,引數就不說了。

另一套轉換的函式是:

int widechartomultibyte(

uint codepage,

dword dwflags,

lpcwstr lpwidecharstr,

int cchwidechar,

lpstr lpmultibytestr,

int cbmultibyte,

lpcstr lpdefaultchar,

lpbool lpuseddefaultchar

);他的引數很多,上面的連線有介紹,這裡就不怎麼細說了。

第乙個是編碼的方式,我一般用cp_acp。第二個是轉換標誌,msdn上說什麼都不設定更快,然後我就什麼都不管了就用null了。具體作用不知道,等遇到了再學。第三個引數就是被轉換的字串,第四個引數是該字串的長度,-1表示自動算長度,如果是手動給出,一定要把最後的終結符長度也算上。我覺得還是-1來的實際。第五個引數就是儲存轉換串的指標,第六個引數就是儲存串的長度,這裡是單位字元的個數。如果轉換的時候沒有終結符,那麼結果也沒有終結符,要注意下。最後兩個引數就是預設的填充字元和是否使用了預設填充字元,我一般就用null代替。

普通串轉寬位元組也是類似。

這裡有幾個注意的,一定要保證空間足夠。還有就是那個長度是單位字元個數,而不是位元組數,在轉換時,推薦被轉換的字串長度設定為-1,因為這樣他會自動算出終結符結束。返回值也是轉換的單位字元個數。例如」相等」有普通串轉換為寬位元組串,返回結果是3,(有終結符),而反過來就是5。如果返回時0 說明轉換失敗。

心得:雖然widechartomultibyte的引數要多,感覺用的沒有wcstombs爽,可是他的準確好高一些,要轉換的話,還用用widechartomultibyte比較合適,還有就是雖然有一套wcs***的庫函式,可惜輸出還是出現問題的。如果全都用寬位元組,那沒有關係wcs***的函式還是蠻好用的。還有乙個疑惑我明明查字典multi是多的意思也就是說multibyte是多位元組,我的中文版vs2005配置裡面也是說的多位元組。搞不懂為什麼要用寬位元組呢?可能是多位元組編碼不好用吧。呵呵。 廢話也說完了,奉上源**:

#include

#include

#include

using namespace std;

int main()

char str[10];                    //定義char字元。

n = wcstombs(str, wc2, 9);        //寬位元組轉換為muiltychar

printf("%s\n", str);            //輸出結果

for (int i = 0; i < 5; ++i)

wc2[4] = 0;

n = wcstombs(str, wc2, 9);        //寬位元組轉換為muiltychar

printf("%s\n", str);            //輸出結果

//另外的方式轉換

n = widechartomultibyte(cp_acp, null, wchar, wcslen(wchar) + 1, str, 10, 0, 0);

printf("%s\n", str);

char str2[10] = "加一";

wchar wc3[10];

n = multibytetowidechar(cp_acp, null, str2, strlen(str2) + 1, wc3, 10);    //char到寬位元組。

system("pause");

return 0;

}

WCHAR我不再懼怕了

寬字元已經困擾我很久了,以前我都是設定專案的屬性把它改為多位元組,不用unicode。不過現在又遇到寬位元組的問題,沒有辦法,只有硬著頭皮學學 我找到的資料 看了之後我才發現原來有wcs 的函式專門處理寬位元組的,就是str 一樣好使。呵呵,我不再懼怕了,就試著自己寫了一下,還是學了蠻多東西的 1....

WCHAR我不再懼怕了

補充 widechartomultibyte轉換為char 之後,是gb2312編碼的。補充兩個gb2312和utf 8的轉換函式。utf 8到gb2312的轉換 char u2g const char utf8 return str gb2312到utf 8的轉換 char g2u const c...

我害怕了嗎?

我害怕了嗎?2012 2 17 2012年2月16號,早上老爸送我去搭車的時候,我還擔心會下雨,還好上車後雨下了一會就沒下了,最近我一直很沒精神,很沒有狀態,更別說是心情了,我很矛盾,我不想呆在家裡,也不想回到學校,所以一直在家獨自掙扎,我知道自己需要乙個時間乙個空間,我要去好好去理解自己房間那個是...