utf8中文编码范围 - 51CTO博客
文章推薦指數: 80 %
utf8中文编码范围,UTF-8有点类似于Haffman编码,它将Unicode编码为:00000000-0000007F的字符,用单个字节来表示;00000080-000007FF的字符用两个字 ...
utf8中文编码范围
关注
mb5fdb0f93c5ca2
utf8中文编码范围
转载
mb5fdb0f93c5ca2
2011-11-1013:55:00
文章标签
utf8
编码
ico
字节流
字节序
文章分类
IT职场
其它
UTF-8有点类似于Haffman编码,它将Unicode编码为:
00000000-0000007F的字符,用单个字节来表示;
00000080-000007FF的字符用两个字节表示(中文的编码范围)
00000800-0000FFFF的字符用3字节表示
编码转换:iconv-f“文件目前编码”-t“文件转换后的编码”-o“转换后生成的新文件名”“源文件名”temp=Iconv.conv(“UTF-8″,“gb2312″,a)
因为目前为止Unicode-16规范没有指定FFFF以上的字符,所以UTF-8最多是使用3个字节来表示一个字符。
但理论上来说,UTF-8最多需要用6字节表示一个字符。
在UTF-8里,英文字符仍然跟ASCII编码一样,因此原先的函数库可以继续使用。
而中文的编码范围是在0080-07FF之间,因此是2个字节表示(但这两个字节和GB编码的两个字节是不同的)。
0、bigendian和littleendian
bigendian和little
endian是CPU处理多字节数的不同方式。
例如“汉”字的Unicode编码是6C49。
那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big
endian。
还是将49写在前面,就是littleendian。
“endian”这个词出自《格列佛游记》。
小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。
我们一般将endian翻译成“字节序”,将bigendian和little
endian称作“大尾”和“小尾”。
4、UTF编码
UTF-8就是以8位为单元对UCS进行编码。
从UCS-2到UTF-8的编码方式如下:
UCS-2编码(16进制)UTF-8字节流(二进制)
0000–007F0xxxxxxx
0080–07FF110xxxxx10xxxxxx
0800–FFFF1110xxxx10xxxxxx10xxxxxx
例如“汉”字的Unicode编码是6C49。
6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx
10xxxxxx10xxxxxx。
将6C49写成二进制是:0110110001001001,
用这个比特流依次代替模板中的x,得到:111001101011000110001001,即E6B189。
读者可以用记事本测试一下我们的编码是否正确。
UTF-16以16位为单元对UCS进行编码。
对于小于0×10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。
对于不小于0×10000的UCS码,定义了一个算法。
不过由于实际使用的UCS2,或者UCS4的BMP必然小于0×10000,所以就目前而言,可以认为UTF-16和UCS-2基本相同。
但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。
5、UTF的字节序和BOM
UTF-8以字节为编码单元,没有字节序的问题。
UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。
例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。
如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?
Unicode规范中推荐的标记字节顺序的方法是BOM。
BOM不是“BillOf
Material”的BOM表,而是ByteOrderMark。
BOM是一个有点小聪明的想法:
在UCS编码中有一个叫做”ZEROWIDTHNO-BREAK
SPACE”的字符,它的编码是FEFF。
而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。
UCS规范建议我们在传输字节流前,先传输字符”ZERO
WIDTHNO-BREAKSPACE”。
这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。
因此字符”ZERO
WIDTHNO-BREAKSPACE”又被称作BOM。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。
字符”ZERO
WIDTHNO-BREAKSPACE”的UTF-8编码是EFBB
BF(读者可以用我们前面介绍的编码方法验证一下)。
所以如果接收者收到以EFBB
BF开头的字节流,就知道这是UTF-8编码了。
Windows就是使用BOM来标记文本文件的编码方式的。
赞
收藏
评论
分享
举报
上一篇:mysql如果数据不存在,则插入新数据,否则更新
下一篇:資料庫的安全(備份/回存)(console)
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
全部评论
(2)
最热
最新
1c03bb1178dd
1年前
真给力,就是有点长
回复
点赞
0b8ca3b9f6bb
1年前
挺好的,点赞!
回复
点赞
相关文章
utf8编码
UTF8是可变编码,数字英文都占1个字节,汉字占3个或4个字节。
mysql和MariaDB默认是utf8mb3,一般情况下没有问题,但若保存一些生僻字或颜文字(emoji)则会出错,这时需要utf8mb4,因这为些字符占4个字节数据库字段...
数据库
字段
16进制
utf8中文
#include
UTF-8是以8位(即1个字节)为单元对原始码进行编码(注意一点:这里所讲的原始码都是...
编码
utf8
UTF8编码解码函数
延伸文章資訊
- 1中文在UTF8和GBK編碼中的範圍 - 程式人生
編碼範圍 1. GBK (GB2312/GB18030) x00-xff GBK雙位元組編碼範圍 x20-x7f ASCII xa1-xff 中文 x80-xff 中文. 2. UTF-8 (U...
- 2utf8中文编码范围 - 51CTO博客
utf8中文编码范围,UTF-8有点类似于Haffman编码,它将Unicode编码为:00000000-0000007F的字符,用单个字节来表示;00000080-000007FF的字符用两个...
- 3中文在UTF8和GBK编码中的范围- 爱E族 - 发现
编码范围 1. GBK (GB2312/GB18030). x00-xff GBK双字节编码范围; x20-x7f ASCII字符; x80-xff 中文(GBK中文范围). xa1-xff 中...
- 4unicode 或utf8 中文编码范围- xiao913 - 博客园
常被提起中文编码范围[/u4E00-/u9FA5]但随便复制了个韩文下来,或者'お',都不行。然后把范围扩大到^[/u2E80-/u9FFF]+$,这样倒是都通过了, ...
- 5整理Unicode 經常會使用到的內碼區域並透過Regex 自動比對 ...
UTF-8 相容於ASCII 的文字範圍 ... 簡單來說,就是「所有的漢字」都在這個範圍裡,包含正體中文、簡體中文與日文、韓文、越南文裡的漢字。