织梦CMS - 轻松建站从此开始!

罗索

在c中处理utf-8

落鹤生 发布于 2012-06-06 11:31 点击:次 
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
TAG:

UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

看代码

  1. size_t utf_length(u_char *p, size_t n) 
  2. // u_char*p 指向一个可能包含utf-8的字符串,n = strlen(p) 
  3.     u_char      c; 
  4.     size_t      len; 
  5.     u_int32_t i; 
  6.  
  7.     for (len = 0, i = 0; i < n; len++, i++) { 
  8.  
  9.         c = p[i]; 
  10.  
  11.         if (c < 0x80) {
  12. // 0x80 的2进制度(10000000),单字节的时候,最大的编码是(01111111), 也就是127,也就是ascii 
  13.             continue
  14.         } 
  15.  
  16.         if (c >= 0xc0) {
  17. //根据utf-8的第2条规则, 如果是2个字节编码成一个符号的时候,那么应该是(110*****,10******) 
  18. /*如果是3个字节编码成一个符号, 那么应该是(1110****,10******,10******) 
  19.    如果是4个字节编码成一个符号, 那么应该是(11110***,10******, 10******,10******) */
  20.             for (c <<= 1; c & 0x80; c <<= 1) {
  21.   /*for的用法,第一个代表赋初始值, 第2个判断, 第3个赋值, 第2次循环的时候,第一个c<<1 已经不用了 */ 
  22.                 i++; //跳过的个数 
  23.             } 
  24.  
  25.             continue
  26.         } 
  27.  
  28.         /* invalid utf */ 
  29.  
  30.         return n; 
  31.     } 
  32.  
  33.     return len; 

 

知道以上的规律, 那么不管是拷贝也好, 显示也好, 基本的原理都是一样的

下面是utf-8copy函数

  1. u_char * utf_cpystrn(u_char *dst, u_char *src, size_t n)  
  2. // n 代表utf-8的符号个数,如果src = “博客”, 那么n = 2 
  3.     u_char  c; 
  4.  
  5.     if (n == 0) { 
  6.         return dst; 
  7.     } 
  8.  
  9.     for ( /* void */ ; --n; dst++, src++) { 
  10.  
  11.         c = *src; 
  12.         *dst = c; 
  13.  
  14.         if (c < 0x80) { 
  15.             if (*dst != '/0') { 
  16.                 continue
  17.             } 
  18.  
  19.             return dst; 
  20.         } 
  21.  
  22.         if (c >= 0xc0) { 
  23.             for (c <<= 1; c & 0x80; c <<= 1) { 
  24.                *++dst = *++src; 
  25.             } 
  26.  
  27.             continue
  28.         } 
  29.  
  30.         /* invalid utf */ 
  31.     } 
  32.  
  33.     *dst = '/0'
  34.  
  35.     return dst; 

 

(yufangbo)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201206/16061.html]
本文出处:CSDN博客 作者:yufangbo 原文
顶一下
(2)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容