一次在定义中文字符串的数组时,按着以往的认知:一个汉字占两个字节,存4个汉字,共占用8+1个’\0’的位置,总共9个字节,结构最后赋值时,确发现数组后连的数据不对了,经查实才发现是数组越界,上网查资料后才发现utf8的中文并不是占两个字节。原来一个汉字占两个字节限于GBK或GB2312,不适用UTF-8。
以下是网上找到的资料:
UTF-8是变长的,长度在1-6字节.查看了字符映射表-汉语.少数是汉字每个占用3个字节,多数占用4个字节.
占用3个字节的范围
-
1 U+2E80 - U+2EF3 : 0xE2 0xBA 0x80 - 0xE2 0xBB 0xB3 共 115 个
-
2 U+2F00 - U+2FD5 : 0xE2 0xBC 0x80 - 0xE2 0xBF 0x95 共 213 个
-
3 U+3005 - U+3029 : 0xE3 0x80 0x85 - 0xE3 0x80 0xA9 共 36 个
-
4 U+3038 - U+4DB5 : 0xE3 0x80 0xB8 - 0xE4 0xB6 0xB5 共 7549 个
-
5 U+4E00 - U+FA6A : 0xE4 0xB8 0x80 - 0xEF 0xA9 0xAA 共 44138 个
-
6 U+FA70 - U+FAD9 : 0xEF 0xA9 0xB0 - 0xEF 0xAB 0x99 共 105 个
-
U+2E80 - U+2EF3 : 0xE2 0xBA 0x80 - 0xE2 0xBB 0xB3 共 115 个
-
U+2F00 - U+2FD5 : 0xE2 0xBC 0x80 - 0xE2 0xBF 0x95 共 213 个
-
U+3005 - U+3029 : 0xE3 0x80 0x85 - 0xE3 0x80 0xA9 共 36 个
-
U+3038 - U+4DB5 : 0xE3 0x80 0xB8 - 0xE4 0xB6 0xB5 共 7549 个
-
U+4E00 - U+FA6A : 0xE4 0xB8 0x80 - 0xEF 0xA9 0xAA 共 44138 个
-
U+FA70 - U+FAD9 : 0xEF 0xA9 0xB0 - 0xEF 0xAB 0x99 共 105 个
合计: 52156 个
占用4个字节的范围
-
7 U+20000 - U+2FA1D : 0xF0 0xA0 0x80 0x80 - 0xF0 0xAF 0xA8 0x9D 共 64029 个
-
U+20000 - U+2FA1D : 0xF0 0xA0 0x80 0x80 - 0xF0 0xAF 0xA8 0x9D 共 64029 个
合计: 64029 个
参考文章:
http://zengwu3915.blog.163.com/blog/static/2783489720130192028855/
http://blog.csdn.net/chummyhe89/article/details/7777613