Rust : utf8与unicode码
一、理论说明
UTF-8
UTF-8 是一个非常惊艳的编码方式,漂亮的实现了对 ASCII 码的向后兼容,以保证 Unicode 可以被大众接受。
UTF-8 是目前互联网上使用最广泛的一种 Unicode 编码方式,它的最大特点就是可变长。它可以使用 1 - 4 个字节表示一个字符,根据字符的不同变换长度。编码规则如下:
对于单个字节的字符,第一位设为 0,后面的 7 位对应这个字符的 Unicode 码点。因此,对于英文中的 0 - 127 号字符,与 ASCII 码完全相同。这意味着 ASCII 码那个年代的文档用 UTF-8 编码打开完全没有问题。对于需要使用 N 个字节来表示的字符(N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为0,剩余的 N - 1 个字节的前两位都设位 10,剩下的二进制位则使用这个字符的 Unicode 码点来填充。
编码规则如下:
Unicode 十六进制码点范围 UTF-8 二进制
0000 0000 - 0000 007F 0xxxxxxx
0000 0080 - 0000 07FF 110xxxxx 10xxxxxx
0000 0800 - 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000 - 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
根据上面编码规则对照表,进行 UTF-8 编码和解码就简单多了。下面以汉字“汉”为利,具体说明如何进行 UTF-8 编码和解码。
“汉”的 Unicode 码点是 0x6c49(110 1100 0100 1001),通过上面的对照表可以发现,0x0000 6c49 位于第三行的范围,那么得出其格式为 1110xxxx 10xxxxxx 10xxxxxx。接着,从“汉”的二进制数最后一位开始,从后向前依次填充对应格式中的 x,多出的 x 用 0 补上。这样,就得到了“汉”的 UTF-8 编码为 11100110 10110001 10001001,转换成十六进制就是 0xE6 0xB7 0x89。
解码的过程也十分简单:如果一个字节的第一位是 0 ,则说明这个字节对应一个字符;如果一个字节的第一位1,那么连续有多少个 1,就表示该字符占用多少个字节。
二、代码
println!("unicode码:");let ch ='汉' as i32;// unicode 码let ch_unicode = format!("{:X}",ch);println!("ch:{:?}",ch_unicode);println!("字节码和二进制代码:");let my_char = "汉".as_bytes();let len = my_char.len();for i in 0..len{println!("bytes[{:?}]:?],{:?}",i,&my_char[i]);let bit_char= format!("{:b}",my_char[i]);println!("i :{:?} ,bit_char :{:?}",i,bit_char);}
output:
unicode码:
ch:"6C49"
字节码和二进制代码:
bytes[0]:?],230
i :0 ,bit_char :"11100110"
bytes[1]:?],177
i :1 ,bit_char :"10110001"
bytes[2]:?],137
i :2 ,bit_char :"10001001"
Rust : utf8与unicode码相关推荐
- 中文与Unicode码互转(utf-8)
实验一. text = u'你好,今天天气不错' text print(text)text = '\u4f60\u597d\uff0c\u4eca\u5929\u5929\u6c14\u4e0d\u9 ...
- 汉字编码(【Unicode】 【UTF-8】 【Unicode与UTF-8之间的转换】 【汉字 Unicode 编码范围】【中文标点Unicode码】【GBK编码】【批量获取汉字UNICODE码】)
参考博客: Unicode与UTF-8互转(C语言实现):http://blog.csdn.net/tge7618291/article/details/7599902 汉字 Unicode 编码范围 ...
- 字符编码ASCII、Unicode 、UTF-8 及实例汉字与Unicode码的相互转化
字符编码ASCII.Unicode .UTF-8 及实例汉字与Unicode码的相互转化 ASCII 码 我们知道,计算机内部,所有信息最终都是一个二进制值.每一个二进制位(bit)有0和1两种状态, ...
- Unicode码转UTF8
转换代码 Unicode码查询网站:https://www.qqxiuzi.cn/zh/unicode-zifu.php //U-00000000 - U-0000007F : 0xxxxxxx // ...
- [PHP] unicode码、UTF-8码、字符的相互转换
unicode与UTF-8 unicode是一个大型字符集,unicode字符集收录了世界上所有的字符,并且为每一个字符分配了一个唯一的数字类型的ID值,这个ID在英文中叫unicode code p ...
- Go 学习笔记(31)— 字符串 string、字符 rune、字节 byte、UTF-8 和 Unicode 区别以及获取字符串长度
1. 字符串 string 类型 Go 语言中字符串的内部实现使用 UTF-8 编码,通过 rune 类型,可以方便地对每个 UTF-8 字符进行访问.当然, Go 语言也支持按照传统的 ASCII ...
- 字符编码总结(UTF-8,UNICODE)
UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5,是指unicode值,至于放在utf-8的编码里去就是由三个字节来组织,所 ...
- python3进行汉字和unicode码的转换
输出某个unicode码对应的汉字和某个汉字对应的unicode编码. ''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 寻找有志同道合的小伙伴,互帮互助,群里还 ...
- php输出字符unicode码,[PHP]单字符Unicode编码解码函数
PHP 自带函数里面似乎是没有能够对字符或字符串进行直接转换的函数,百度了一下,发现了一个封装函数能用. 精简过后的函数内部还是会经过几次编码转换,但是我发现编码之后对特殊字符的转换有问题,索性再精简 ...
- Visual Studio——多字节编码与Unicode码
多字节字符与宽字节字符 1) char与wchar_t 我们知道C++基本数据类型中表示字符的有两种:char.wchar_t. char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因 ...
最新文章
- 最常见的《最聪明的技巧》实战讲解!
- 实训C++语言设计——Date日期系统实现
- 【Linux 内核 内存管理】RCU 机制 ① ( RCU 机制简介 | RCU 机制的优势与弊端 | RCU 机制的链表应用场景 )
- js样式会覆盖html样式,js实现html节点、CSS样式、事件的动态添加以及html覆盖层的添加...
- 霍金的遗愿清单:离开地球,警惕人工智能
- 【干货】普华永道:新形势下,企业如何进行数字化转型.pdf(附下载链接)
- php+mysql事务处理例子详细分析实例
- 【转】只有运用你的逻辑才能看懂其中的恐怖
- de4dot 反编译
- matlab 数字波束合成,dbf数字波束合成
- aliez歌词_【aLIEz】附平假名歌词(完整)
- Excel的FIND函数及其用法
- 中央民族大学教授赵小兵:少数民族语言信息化关乎民众福祉,需要各界的更多支持...
- 如何以管理员身份进入dos命令窗口
- Cocoa -- 添加和移除开机启动项
- cmake Could NOT find Boost (missing: xxx 的问题 已解决
- hadoop框架流程图梳理
- WebGL着色器内置变量gl_PointSize、gl_Position、gl_FragColor、gl_FragCoord、gl_PointCoord
- 系统架构中常见问题及解决方案
- ResetTemplate封装