本來在網上能找到很多這方面的**,但很多都是**,且很多細節讓人理解起來很彆扭,估計有的
**的也是不知所云。
雖說就兩個windows api的呼叫,但只有自己去寫**測試研究,才真正領會了這些細節。文中注釋有寫的不當的歡迎指正。
下面是我寫的測試程式:
[cpp]view plain
copy
#include "stdafx.h"
#include
#include
/* multibytetowidechar和widechartomultibyte每個都呼叫了兩次,
第一次轉換是為了得到轉換後所需的長度 */
void
testmultitowidechar()
wchar
*pwszbuffer =
newwchar
[nlen];
nlen = multibytetowidechar(cp_acp, 0, szbuffer, -1, pwszbuffer, nlen);
if(nlen == 0)
// pwszbuffer在記憶體中的位元組序為75 8d 66 6b 9b 6d 00 00,結尾的null字元也佔兩個位元組
wprintf(l"pwszbuffer = %s\n"
, pwszbuffer);
delete
pwszbuffer;
} while
(false
);
} void
testwidetomultichar()
char
*pszbuffer =
newchar
[nlen];
nlen = widechartomultibyte(cp_acp, 0, wszbuffer, -1, pszbuffer, nlen, null, null);
if(nlen == 0)
printf("pszbuffer = %s\n"
, pszbuffer);
delete
pszbuffer;
} while
(false
);
} /* 這個函式間接囊括了unicode到utf8的轉換和utf8到unicode的轉換,
網上很多帖子對這個轉換為什麼要進行兩次轉換基本沒有說明 */
void
testmultitoutf8()
wchar
*pwszbuffer =
newwchar
[nlen];
nlen = multibytetowidechar(cp_acp, 0, szbuffer, -1, pwszbuffer, nlen);
if(nlen == 0)
wprintf(l"pwszbuffer = %s\n"
, pwszbuffer);
// 再轉換成utf-8編碼
// 剛開始用這兩個api時,對這個codepage的認識很模糊,為什麼有的地方用cp_utf8,有的用cp_acp
nlen = widechartomultibyte(cp_utf8, 0, pwszbuffer, -1, null, 0, null, null);
if(nlen == 0)
// nlen is in bytes values
char
*pszbuffer =
newchar
[nlen];
nlen = widechartomultibyte(cp_utf8, 0, pwszbuffer, -1, pszbuffer, nlen, null, null);
if(nlen == 0)
/* 下面的**只是測試,再將此utf-8字串轉換成unicode,看看輸出結果, 注意
這裡用的codepage還是cp_utf8,因為只有這個codepage能在utf8和unicode間進行互轉換,它
表示的意思並不是轉換目標的編碼,而是當前轉換需要用到這個codepage */
nlen = multibytetowidechar(cp_utf8, 0, pszbuffer, -1, null, 0);
if(nlen == 0)
// nlen is in bytes values
wchar
*pwszbuf2 =
newwchar
[nlen];
nlen = multibytetowidechar(cp_utf8, 0, pszbuffer, -1, pwszbuf2, nlen);
if(nlen == 0)
// nlen is in bytes values
wprintf(l"pwszbuf2 = %s\n"
, pwszbuf2);
delete
pwszbuf2;
delete
pwszbuffer;
} while
(false
);
} int
_tmain(
intargc, _tchar* argv)
寬位元組UTF 8 多位元組互轉
在進行windows程式設計時,常常遇到不同字元編碼之間的轉換以對應不同的輸出格式,本文介紹寬位元組utf 8編碼格式和多位元組之間的專案轉換。分別呼叫windows底層函式multibytetowidechar和 widechartomultibyte實現。1.utf 8轉多位元組 std str...
unicode和utf8的關係
很久以前儲存的,別人寫的但是很明了 很久很久以前,有一群人,他們決定用8個可以開合的電晶體來組合成不同的狀態,以表示世界上的萬物。他們看到8個開關狀態是好的,於是他們把這稱為 位元組 再後來,他們又做了一些可以處理這些位元組的機器,機器開動了,可以用位元組來組合出很多狀態,狀態開始變來變去。他們看到...
Unicode和utf 8的區別
很久以前儲存的,別人寫的但是很明了 很久很久以前,有一群人,他們決定用8個可以開合的電晶體來組合成不同的狀態,以表示世界上的萬物。他們看到8個開關狀態是好的,於是他們把這稱為 位元組 再後來,他們又做了一些可以處理這些位元組的機器,機器開動了,可以用位元組來組合出很多狀態,狀態開始變來變去。他們看到...