多位元組 unicode和utf 8的轉換

2021-06-23 05:42:46 字數 2636 閱讀 9739

本來在網上能找到很多這方面的**,但很多都是**,且很多細節讓人理解起來很彆扭,估計有的

**的也是不知所云。

雖說就兩個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個開關狀態是好的,於是他們把這稱為 位元組 再後來,他們又做了一些可以處理這些位元組的機器,機器開動了,可以用位元組來組合出很多狀態,狀態開始變來變去。他們看到...