UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
看代码
- size_t utf_length(u_char *p, size_t n)
-
- {
- u_char c;
- size_t len;
- u_int32_t i;
-
- for (len = 0, i = 0; i < n; len++, i++) {
-
- c = p[i];
-
- if (c < 0x80) {
-
- continue;
- }
-
- if (c >= 0xc0) {
-
-
- */
-
- i++;
- }
-
- continue;
- }
-
-
-
- return n;
- }
-
- return len;
- }
知道以上的规律, 那么不管是拷贝也好, 显示也好, 基本的原理都是一样的
下面是utf-8copy函数
- u_char * utf_cpystrn(u_char *dst, u_char *src, size_t n)
-
- {
- u_char c;
-
- if (n == 0) {
- return dst;
- }
-
- for ( ; --n; dst++, src++) {
-
- c = *src;
- *dst = c;
-
- if (c < 0x80) {
- if (*dst != '/0') {
- continue;
- }
-
- return dst;
- }
-
- if (c >= 0xc0) {
- for (c <<= 1; c & 0x80; c <<= 1) {
- *++dst = *++src;
- }
-
- continue;
- }
-
-
- }
-
- *dst = '/0';
-
- return dst;
- }
(yufangbo) |