« 讨厌的Ultra Edit | (回到Blog入口) | mod_python配置,及简单psp开发入门 »

完成 UTF8 和 UTF16 转换函数

UTF8文本头为 EF BB BF
UTF16 文本头: Big-Endian的FEFF; 表明这个字节流是;Little-Endian的FFFE

int convertUTF8UTF16(unsigned char* utf8, int& size8, char* utf16, int& size16)
{
int count =0, i;
char tmp1, tmp2;
unsigned short int integer;
unsigned short int *p;
for(i=0;i {
p = (unsigned short int*)&utf16[i];

if( utf8[count] < 0x80)
{
// <0x80
integer = utf8[count];
count++;
}
else if( (utf8[count] < 0xDF) && (utf8[count]>=0x80))
{
integer = utf8[count] & 0x1F;
integer = integer << 6;
integer += utf8[count+1] &0x3F;
count+=2;
}
else if( (utf8[count] <= 0xEF) && (utf8[count]>=0xDF))
{
integer = utf8[count] & 0x0F;
integer = integer << 6;
integer += utf8[count+1] &0x3F;
integer = integer << 6;
integer += utf8[count+2] &0x3F;
count+=3;
}
else
{
printf("error!\n");
}
*p = integer;
}
size8 = count;
size16 = i;

return size16;
}

int convertUTF16UTF8(char* utf16, int& size16, char* utf8, int& size8)
{
int i=0, count=0;
char tmp1, tmp2;

unsigned short int integer;
for(i=0;i {
integer = *(unsigned short int*)&utf16[i];

if( integer<0x80)
{
utf8[count] = utf16[i] & 0x7f;
count++;
}
else if( integer>=0x80 && integer<0x07ff)
{
tmp1 = integer>>6;
utf8[count] = 0xC0 | (0x1F & integer>>6);
utf8[count+1] = 0x80 | (0x3F & integer);
count+=2;
}
else if( integer>=0x0800 )
{
tmp1 = integer>>12;
utf8[count] = 0xE0 | (0x0F & integer>>12);
utf8[count+1] = 0x80 | ((0x0FC0 & integer)>>6);
utf8[count+2] = 0x80 | (0x003F & integer);

count += 3;
}
else
{
printf("error\n");
}
}

size16 = i;
size8 = count;
return count;
}

引用通告

TrackBack URL for this entry:
如果您想引用这篇文章到您的Blog,
请复制下面的链接,并放置到您发表文章的相应界面中。
http://www.pyapp.com/cgi-bin/mt/mt-tb.cgi/17

评论 (3)

Uranus:

请问下我只知道utf16和他的size,那我应该给数组utf8的长度是多少才能确保全部拷贝。
convertUTF16UTF8(char* utf16, int& size16, char* utf8, int& size8)

Uranus:

请问下我只知道utf16和他的size,那我应该给数组utf8的长度是多少才能确保全部拷贝。
convertUTF16UTF8(char* utf16, int& size16, char* utf8, int& size8)

Uranus:

请问下我只知道utf16和他的size,那我应该给数组utf8的长度是多少才能确保全部拷贝。
convertUTF16UTF8(char* utf16, int& size16, char* utf8, int& size8)

发表一个评论

(如果你此前从未在此 Blog 上发表过评论,则你的评论必须在 Blog 主人验证后才能显示,请你耐心等候。)

关于

此页面包含了发表于2006年12月05日 上午09时50分的 Blog 上的单篇日记。

此 Blog 的前一篇日记是 讨厌的Ultra Edit

此 Blog 的后一篇日记是 mod_python配置,及简单psp开发入门

更多信息可在 主索引 页和 归档 页看到。

Powered by
Movable Type 3.33