64,660
社区成员
发帖
与我相关
我的任务
分享
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
char *UnicodeToUtf8(LPWSTR pUnicode) {
const int MAXL=16;//为测试超长方便,此处将1024替换为16;
static char Utf8[MAXL*4];
UINT nLength;
Utf8[0]=0;
if (pUnicode==NULL) return (char *)Utf8;
nLength=__min((int)wcslen(pUnicode),MAXL-1);
WideCharToMultiByte(CP_UTF8, 0, pUnicode, nLength, (LPSTR)Utf8, MAXL*4, NULL,NULL);
return (char *)Utf8;
}
void HexDump(char *buf,int len,int addr) {
int i,j,k;
char binstr[80];
for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%08x -",i+addr);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}
int main() {
char *p;
setlocale(LC_ALL,"chs");
printf("--1--\n");
p=UnicodeToUtf8(NULL);
HexDump(p,strlen(p)+1,(int)&p);
printf("--2--\n");
p=UnicodeToUtf8(L"啊");
HexDump(p,strlen(p)+1,(int)&p);
printf("--3--\n");
p=UnicodeToUtf8(L"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊");
HexDump(p,strlen(p)+1,(int)&p);
printf("--4--\n");
p=UnicodeToUtf8(L"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊哈");
HexDump(p,strlen(p)+1,(int)&p);
return 0;
}
//--1--
//0012ff6c - 00 .
//--2--
//0012ff6c - e5 95 8a 00 ....
//--3--
//0012ff6c - e5 95 8a e5 95 8a e5 95 8a e5 95 8a e5 95 8a e5 ................
//0012ff7c - 95 8a e5 95 8a e5 95 8a e5 95 8a e5 95 8a e5 95 ................
//0012ff8c - 8a e5 95 8a e5 95 8a e5 95 8a e5 95 8a 00 ..............
//--4--
//0012ff6c - e5 95 8a e5 95 8a e5 95 8a e5 95 8a e5 95 8a e5 ................
//0012ff7c - 95 8a e5 95 8a e5 95 8a e5 95 8a e5 95 8a e5 95 ................
//0012ff8c - 8a e5 95 8a e5 95 8a e5 95 8a e5 95 8a 00 ..............
//
char *UnicodeToUtf8(LPCSTR pUnicode)
{
const int MAXL=1024;
static char Utf8[MAXL*4];
UINT nLength;
Utf8[0]=0;
if (pUnicode==NULL) return (char *)Utf8;
nLength=__min((int)wcslen(pUnicode),MAXL-1);
WideCharToMultiByte(CP_UTF8, 0, pUnicode, nLength, (LPSTR)Utf8, NULL,NULL);
return (char *)Utf8;
}
CStringW Utf8ToUnicode(LPCSTR pUtf8)
{
if (pUtf8==NULL)
return L"";
UINT nLength=strlen(pUtf8);
int nChar = MultiByteToWideChar(CP_UTF8, 0, pUtf8, nLength, NULL, 0);
CStringW tempBuffer;
nChar = MultiByteToWideChar(CP_UTF8, 0, pUtf8, nLength, (LPWSTR)tempBuffer.GetBufferSetLength(nChar), nChar);
if(nChar == 0)
{
return L"";
}
tempBuffer.ReleaseBuffer();
return tempBuffer;
}