java的URL编码和JS的URl问题

应用场景

url中包含中文及特殊字符 , url中需要嵌套另一个url时 , 如需要向第三方发送get请求 , 然后需要提供一个回调地址 , 这是就是把url作为参数值放入url中 , 这个url必然是合法的url , 但仍然不能直接拼接到url中, 会导致浏览器无法解析 . 所以需要进行url编码之后再进行拼接.

URL编码的来源

URL编码定义

网络标准RFC 1738做了硬性规定:URL只有字母和数字[0-9a-zA-Z]、一些特殊符号“$-_.+!*‘(),”[不包括双引号]、以及某些保留字。

这意味着,如果URL中有汉字,就必须编码后使用。但是麻烦的是,RFC 1738没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。这导致"URL编码"成为了一个混乱的领域

ASCLL码

我们知道,计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111。

https://www.w3cschool.cn/htmltags/html-urlencode.html ASCII码对照表

ASCLL码存在的问题

1.就是表示数量问题:
英语用128个符号编码就够了,但是用来表示其他语言,汉字有10W左右,那么又如何表示呢
2. 标准不统一: 不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如:130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号(这个就是之前计算机老是乱码的软件的原因)

UNICODE字符集

字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)
如果一个字节一个字符,一个字节是8位。并且只要您从未将字符串从一台计算机移动到另一台计算机,或者说一种以上的语言,它总是可以正常工作的。但是,一旦Internet出现,将字符串从一台计算机移到另一台计算机就变得很普遍了,整个混乱局面逐渐恶化。幸运的是,已经发明了Unicode
无论平台,程序或语言是什么,Unicode都会为每个字符提供唯一的数字

UNCODE的问题?

1.规则太死:如果每个字符都是用4个字节来表示,那么其实造成了内存上的很大浪费,特别是在使用英语的计算器。
2.已经有了使用ASCII码和其他字符集的所有这些文档,怎么兼容它们呢?

UTF-8 编码规则:

将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)

UTF-8是这样做的:

  1. 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;
  2. n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。
    这样就形成了如下的UTF-8标记位:
    0xxxxxxx110xxxxx 10xxxxxx1110xxxx 10xxxxxx 10xxxxxx11110xxx 10xxxxxx 10xxxxxx 10xxxxxx111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

UNICODE和UTF-8转换?

在这里插入图片描述

  1. 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;
  2. n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。
    举例:
    测的UNICODE? \u6d4b 二进制: 110 1101 0100 1011?
    它的UTF-8格式:1110xxxx 10xxxxxx 10xxxxxx
    1110 0110 1011 0101 1000 1011
    UTF-8的编码:e6b58b %E6%B5%8B
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值