unicode和url编码及相关细节

详细内容来自:
Unicode(UTF-8, UTF-16)令人混淆的概念
Java 语言中一个字符占几个字节?(知乎)


unicode和UTF

1.unicode:统一的字符编号,仅仅提供字符与编号间的映射。由于历史遗留及口语化原因,说起unicode,也常指UTF-16。


2.UTF:unicode transformation format ,即unicode具体的实现方式。

(1)UTF-16:
旧标准中:这个“16”意思为固定使用16位(即2字节)储存一个字符。0-127就是ASCII那些,128-65536就是扩充的那些字符,很容易理解。
新标准中:使用16位/32位来储存一个字符,不再是定长的16位。这里要注意,意思是在UTF-16编码下,可能解析一个字符时读取2个字节来解析,但下一个字符读取4个字节来解析。新标准中,UTF-16也变成不定长的编码了。

(2)UTF-8:这个“8”意思为8位为一块(说了等于没说系列)。
这个“8”很容易误导人。实际上它是不定长编码,使用8位/16位/24位/32位来储存一个字符。

(3)UTF-32:固定使用32位储存一个字符,是定长编码。


3.c++中字符char的问题:

(1)char c='中'; 将发生截断,c中并不是储存着这个'中'
首先编译器将检测你的系统默认编码(如GBK),把这个'中'转换为一个int的值(int占4字节,足够表示了),然后把这个int强制转换为char,赋值给c,发生截断。这里可见,c++不能使用一个char来储存一个中文字符。

(2)char arr[3]="中" 正确。
编译器处理时,将使用两个字节( char[0]和char[1] )来储存'中'(对应的int的低16位),同时为char[2]赋值'\0'。即此时必须借助char数组


4.java中char的问题:

(1)java中字符占2字节,与c++的不同

(2)java内部编码采用UTF-16。但是新标准中UTF-16是不定长编码,一个字符可能为2/4字节,所以实际上java中char依然有这个问题。如果某个字符需要4字节,那么将发生截断,低2字节将被赋值到char中。实际上4字节的那些字符,很难打出来的,一般能输入进去的话都没问题。

(3)String类由char[]当储存结构,但是屏蔽了UTF-16不定长造成的差异。也就是说如果一个字符串由两个4字节的字符组成,那么String.length依然为2,且此时打印String依然能正确输出。详细看一开始就贴出来的链接。

(4)内部编码和外部编码:

内码是程序内部使用的字符编码,特别是某种语言实现其char或String类型在内存里用的内部编码;
外码是程序与外部交互时外部使用的字符编码。“外部”相对“内部”而言;不是char或String在内存里用的内部编码的地方都可以认为是“外部”。

详细看一开始就贴出来的链接。

5.编码
unicode编码表中的第20013号字符为'中',其中

(1)UTF-16BE(BE意思为大端):
很简单,直接把十进制的20013用16位二进制表示即可:
01001110 00101101

(2)UTF-8:
建议自行去了解UTF-8的规则。这里显然需要三个字节的格式1110xxxx 10xxxxxx 10xxxxxx,把对应的二进制填入即可:
11100100 10111000 10101101

(3)你值得拥有的查看unicode编码的网站:Unicode®字符百科

字符'中'的显示


url编码

问题:http://localhost?a=1&b=2,url中的查询参数是什么?
很明显是a=1b=2。但为什么不理解为a= "1&b=2"这个字符串呢?
这问题出在&这个字符,跟我们字符串的反斜杠\差不多道理,&是一个特殊意义的符号。后端将把这个字符当作分割用的标记(=?和其他符号基本同理)。
也就是如果我们需要传送a= "1&b=2"时,应该写成http://localhost?a=1%26b%3D2。其中%26就表示&,%3D就表示=,更多转义可以查看url编码规则。

1.urlencoded:

url编码是基于unicode/GBK编码的一种编码方式,以解决上面提到的和其他(中文传输)问题。
一个最简单的例子,如前面例子字符串"中"的UTF-8编码为E4 B8 AD,那么urlencoded后,就是字符串%E4%B8%AD。如果是基于UTF-16BE,那么urlencoded后就是字符串%4E%2D

显然,对不同编码的字符(如中文),urlencoded出来的结果可能有所不同。而对于&=?这些特殊符号,编码规则是一定的

2.application/x-www-form-urlencoded

是http头content-type的可选值之一,意味着当前请求参数/实体内容进行过urlencoded。此外application/x-www-form-urlencoded; charset=UTF-8表明这个urlencoded是基于UTF-8编码的,避免解码时出错。

3.post方式时

(1)application/x-www-form-urlencoded; charset=UTF-8
描述如上,请了解浏览器表单默认自动编码提交和自己手动提交的区别,避免进行两次urlencoded或没有urlencoded

(2)application/json; charset=UTF-8
没有进行url编码。因为此时后端不需要&符号来做分隔符,直接传json字符串就是

(3)multipart/form-data
没有进行url编码。因为此时后端不需要&符号来做分隔符,而是使用一种特殊分隔符,详细右转百度

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容