UTF-8编码转换实现
2010-12-26 12:23
204 查看
/////////////////
UTF-8 转换原理
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
//以下摘自D7的VCL源程序~
第一个字节的开头"1"的数目就是整个串中字节的数目
if c <= $7F then
begin
{
U-00000000 - U-0000007F: 0xxxxxxx
1个字节的直接复制
}
Dest[count] := AnsiChar(c);
Inc(count);
end
else if c > $7FF then
begin
{
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
3个字节的分开处理, 上面可以放X的位置是 4+6+6 个,
第一个字节只放 四个 XXXX, 所以要将后 原始内容 后移 6+6位,然后与 11100000B(E0) or运算.
第二个字节在将原始内容后移6位,然后与 111111B and运算,这样就去掉了原始内容前面的位,只保留想要的中间6位,
将这个内容再与 10000000B or 运算.
第三个字节与第二个字节的思路一样,只是不用再移位了.
}
if count + 3 > MaxDestBytes then
break;
Dest[count] := AnsiChar($E0 or (c shr 12));
Dest[count+1] := AnsiChar($80 or ((c shr 6) and $3F));
Dest[count+2] := AnsiChar($80 or (c and $3F));
Inc(count,3);
end
else // $7F < Source[i] <= $7FF
begin
if count + 2 > MaxDestBytes then
break;
Dest[count] := AnsiChar($C0 or (c shr 6));
Dest[count+1] := AnsiChar($80 or (c and $3F));
Inc(count,2);
end;
UTF-8 转换原理
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
//以下摘自D7的VCL源程序~
第一个字节的开头"1"的数目就是整个串中字节的数目
if c <= $7F then
begin
{
U-00000000 - U-0000007F: 0xxxxxxx
1个字节的直接复制
}
Dest[count] := AnsiChar(c);
Inc(count);
end
else if c > $7FF then
begin
{
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
3个字节的分开处理, 上面可以放X的位置是 4+6+6 个,
第一个字节只放 四个 XXXX, 所以要将后 原始内容 后移 6+6位,然后与 11100000B(E0) or运算.
第二个字节在将原始内容后移6位,然后与 111111B and运算,这样就去掉了原始内容前面的位,只保留想要的中间6位,
将这个内容再与 10000000B or 运算.
第三个字节与第二个字节的思路一样,只是不用再移位了.
}
if count + 3 > MaxDestBytes then
break;
Dest[count] := AnsiChar($E0 or (c shr 12));
Dest[count+1] := AnsiChar($80 or ((c shr 6) and $3F));
Dest[count+2] := AnsiChar($80 or (c and $3F));
Inc(count,3);
end
else // $7F < Source[i] <= $7FF
begin
if count + 2 > MaxDestBytes then
break;
Dest[count] := AnsiChar($C0 or (c shr 6));
Dest[count+1] := AnsiChar($80 or (c and $3F));
Inc(count,2);
end;
相关文章推荐
- 不用iconv函数实现UTF-8编码转换GB2312的PHP函数
- linux C gbk utf-8编码转换
- 批量 gb->utf-8编码转换. (转)
- Unicode与UTF-8互转(C语言实现)
- GBK转成utf-8,java实现及讲解
- php实现utf-8和GB2312编码相互转换函数代码
- 使用Perl创建指定编码格式(如utf-8)文件的实现代码
- Unicode与UTF-8互转(C语言实现)
- 用JavaScript实现的将GB2312转换为UTF-8编码
- 迅雷笔试题的Utf-8编码检测的实现
- Unicode与UTF-8互转(C语言实现)
- 字符集(二)-unicode实现方式utf-8
- python学习笔记 --- 实现将文件转换编码为utf-8-sig(带BOM)
- PHP UTF-8字符串截断函数实现中文字符的无乱码截断
- 用javascript实现gb2312转utf-8的脚本
- php gettext方式实现UTF-8国际化多语言(i18n)
- JAVA实现GBK,UTF-8与中文互转
- 用VBS实现的批量gb2312转utf-8,支持拖动
- php gettext方式实现UTF-8国际化多语言(i18n)
- 中文字符 unicode转utf-8函数 python实现