我是靠谱客的博主 愉快冷风,最近开发中收集的这篇文章主要介绍字符集,字符编码和转义,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

基础知识

  • 编码:按照某种规则将字符储存到计算机中,如’a’用什么表示,称为编码
  • 解码:将存储在计算机中的二进制数取出,并解释成原字符,称为解码
  • 字符集:是一个系统支持的所有抽象字符的集合。就是一个表,每个符号都有对应的编号
  • 字符编码:是一套规则。在字符集拿到编号后,并不是简单的转成二进制数,而是根据这套规则来将编码压缩成一个更小的二进制数并储存到设备中,从而俭约了存储空间

常用字符集

  • ASCII字符集
  • GB2312
  • BIG5
  • GB18030
  • Unicode 标准万国码

ASCII

ASCII字符集:包括控制字符,英文字符,阿拉伯数字和西文符号

ASCII编码:一共有127个符号,所以7位(bit)就可以保存了(2*7 == 128)。为了表示更多的欧洲常用字符对ASCII进行了扩展,ASCII扩展字符集使用8位(bits)表示一个字符,共256字符

Unicode

Unicode字符集:超过十万个字符,万国码

Unicode是字符集,UTF-32/ UTF-16/ UTF-8是三种字符编码方案。

utf-8编码

utf是unicode的一种实现方式。

utf8编码步骤
  • 先从unicode字符集获取编码,例如 ‘真’:十进制:30495转成 二进制:01110111 00011111

  • 单字节规则(ascii字符集囊括的字节):字节的第一位设为了0,后面7位是字节的二进制数

  • 多字节规则:

    • 判断字符的编码范围(1-4 bytes)
    • 对于n个字节的符号,第一个字节的前n个设为1n+1设为0
    • 后面的n-1个字节前两位设为10
    • 然后把符号的unicode编码的二进制数 塞入 空白的二进制位
    题目:
    ‘真’字 
    1. -- unicode --> 30495 --> 01110111 00011111 --> x771f
    他的范围在 0x0800 ~ 0xffff 间,所以是3bytes(字节)
    2.3字节: 1110xxxx 10xxxxxx 10xxxxxx
    3.unicode编码二进制塞入空白处:
    	1110xxxx --> 1110 0111
    	10xxxxxx --> 10 011100   
    	10xxxxxx --> 10 011111
    4.utf8存入硬盘的二进制数是: 11100111 10011100 10011111。十六进制数是:
    

    所以每种编码的规则不同,所以存入文件的二进制数也不同

字节序

将编码后的二进制(书籍blog通常以十六进制展示)存入存储器

‘真’字 如果用unicode码存入存储器,那么存入的值是x771f,需要2个字节来保存,第一个字节保存x77,第二字节存x1f 。此处就是多字节

x771f = x7700 + x001f

  • 对于单字节(x00 - xff)来说,没有顺序可言,都是直接存入1bytes
  • 对于多字节数据,在不同的处理器有不同的存放方式
    • 大端序
    • 小端序
    • 混合序
    • 高位字节:多字节排在前面的字节,例子中的x77
    • 低位字节:多字节排在后面的字节,例子中的x1f

大端序

高位字节存储在最低的内存地址处。

内存地址固定是从低到高

上述例子中的大端序存储方式的结果是:

低地址 --> 高地址

x77 --> x1f

小端序

高位字节存储在最高的内存地址处。

内存地址固定是从低到高

上述例子中的小端序存储方式的结果是:

低地址 --> 高地址

x1f --> x77

混合序

URL编码

当url存在特殊字符时(例如:汉字/, %等),需要将url进行编码
原理:将特殊字符转成16进制数,并把0x变成%,例如

  • “/”,它的ascii码是92,92的十六进制是2F,所以“/”的url编码就是%2F
  • “胡”的ascii码是-17670,十六进制是BAFA,url编码是“%BA%FA”。
package main

import (
	"fmt"
	"net/url"
)

func main() {
	urlStr := "http://baidu.com?name=小阿磊&uri=/sdf/sdg"
	encode := url.QueryEscape(urlStr)
	fmt.Println(encode)
	fmt.Println(url.QueryUnescape(encode))
	// http%3A%2F%2Fbaidu.com%3Fname%3D%E5%B0%8F%E9%98%BF%E7%A3%8A%26uri%3D%2Fsdf%2Fsdg
	//http://baidu.com?name=小阿磊&uri=/sdf/sdg <nil>


}

转义

将汉字或者特殊字符,转成16进制数,然后添加u前缀

参考

https://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html

https://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F

最后

以上就是愉快冷风为你收集整理的字符集,字符编码和转义的全部内容,希望文章能够帮你解决字符集,字符编码和转义所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部