日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

编码(2)从字节理解Unicode(UTF8/UTF16)

發布時間:2024/4/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编码(2)从字节理解Unicode(UTF8/UTF16) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://www.cnblogs.com/zizifn/p/4716712.html

從字節理解Unicode(UTF8/UTF16)

?

如果你不知道或者不了解什么是Unicode/UTF8/UTF16,請詳細閱讀這篇文章(這也是這篇博文的先決條件):

學點編碼知識又不會死:Unicode的流言終結者和編碼大揭秘

? ?

但是如果你看完以上文章后,疑惑為什么一個Unicode:0x4F60(對應漢字是"你")會在UTF8下占用3個字節的存儲空間。

按照排列組合2個字節完全可以存儲多數unicode字符,明顯字符"你"(0x4F60)是在2個字節最大可能范圍內(0xFFFF)。

但是為什么UTF8卻使用3個字節存儲字符"你"呢?這樣不是明顯浪費存儲空間嗎?

? ?

答案不僅是UTF8沒有浪費存儲空間,而且UTF8還是一個精美的設計,至少在我看來。

? ?

Unicode/UTF8/UTF16

雖然你或許可能知道什么UTF8,但是我還是要簡單介紹下什么是UTF8?什么是UTF16?什么是unicode?

? ?

看完我開頭推薦的那篇詳細的博文(學點編碼知識又不會死:Unicode的流言終結者和編碼大揭秘)。你應該知道unicode是一種索引表,它規定了任何字符的code。比如:字符"你"就是0x4F60,在整個宇宙(你確定是整個宇宙?)的任何地方,只要你用的是unicode,那么"你"的unicode就是"0x4F60"。

? ?

所以Unicode并不關心世界上有多少字符,如果你想把一個字符放入Unicode中,那么請告訴我你要放的是什么字符?那么Unicode會給你個索引號碼?比如:漢字"你"就是"0x4F60"。也就是假如有一天人類統一了"三體星人"(可惜的是三體星已經被摧毀了。。),我們也可以把三體星文加入到Unicode中。

? ?

當然Unicode同樣不關心你怎么實現,你怎么把字符編碼成字節?所以unicode并不知道字符"你"占用幾個字節。這時候就是UTF(Unicode Transformation Formats)來規定unicode字符該如何存儲,占用幾個字節?

? ?

總而言之:

Unicode定義世界每個字符的索引值。

UTF8/UTF16實現Unicode的標準,把字符存儲到存儲介質中。

? ?

從字節角度看UTF8

我們知道存儲字節多少只和UTF有關,那么我們先看UTF8一張表.詳情請查看wikipedia的介紹?。當然你看百度百科也是可以的。

? ?

Bits of

code point

First

code point

Last

code point

Bytes in

sequence

Byte 1

Byte 2

Byte 3

Byte 4

Byte 5

Byte 6

??7

U+0000

U+007F

1

0xxxxxxx

??

??

??

??

??

11

U+0080

U+07FF

2

110xxxxx

10xxxxxx

??

??

??

??

16

U+0800

U+FFFF

3

1110xxxx

10xxxxxx

10xxxxxx

??

??

??

21

U+10000

U+1FFFFF

4

11110xxx

10xxxxxx

10xxxxxx

10xxxxxx

??

??

26

U+200000

U+3FFFFFF

5

111110xx

10xxxxxx

10xxxxxx

10xxxxxx

10xxxxxx

??

31

U+4000000

U+7FFFFFFF

6

1111110x

10xxxxxx

10xxxxxx

10xxxxxx

10xxxxxx

10xxxxxx

根據這張表,我們可以知道0x4F60(字符"你")是在范圍(0x0800-0xFFFF),所以在UF8下需要3個字節來存儲。

? ?

下面讓例子來闡述為什么需要3個字節?首先,先看下這3個字節存放的是什么?

在windows新建一個txt,寫入字符"UTF8你"(加入UTF8是為了有個基準線查看"你"的真實字節值),然后另存為UTF8編碼。用notepad++(需要裝HEX-editor插件)或者Binary Viewer,查看"你"在UTF8下的16進制值。

? ?

? ?

我們知道字符"UTF8"16進制就是他們的ASNI碼"0x55,0x54,0x46,0x38".那么字符"你"在UTF8下3個字節的值是"0xE4/0xBD/0xA0".

? ?

"0xE4"-->"11100100".

"0xBD"-->"10111101".

"0xA0"-->"10100000".

查看上面UTF8的表,表給出給出每個字節 的前幾個固定的二進制數。

比如3個字節的Unicode會用到這個格式:"1110xxxx 10xxxxxx 10xxxxxx"來存儲字符,對應到字符"你"就是"11100100?/10111101/ 10100000"。

拿出紅色標注的部分"0100 111101 100000",轉換成16進制就是"0x4F60"也就對應的是Unicode字符"你"。

? ?

現在我們可以知道UTF8固定每個字節的前面幾位二進制值,然后用其他的位來表示字符。但是為什么UTF8的設計者們要這樣設計呢?

? ?

我想這是UTF8為了兼容ASNI所要付出的代價,請查看上表,UTF8下是完全兼容asni,也就是asni標準的下的文檔,在UTF8下顯示完全不是問題(因為ASNI存儲字節值和UTF8是一樣的)。字符都是一個一個字節存儲的,UTF8肯定是一個一個字節的讀取,那么UTF8怎么在完全兼容ASNI前提下,是怎么知道某個字符是需要額外字節信息的?UTF8只有固定前幾位二進制來決定這個字符需要以后的幾個字節,又因為為了兼容ASNI,所以額外字節也需要固定前2位"10xxxxxx",來決定這個字節值不是代表ASNI字符。ASNI的格式是“0xxxxxxx”。

? ?

另外,你也完全可以自己實現一個標準來解釋Unicode,比如就叫做UTF9吧,只要你能完全解釋Unicode。

實際上是有UTF7,UTF8,UTF16,UTF32的。

? ?

從字節角度看UTF16

同樣的,我們把txt:"UTF8你"另存為UTF16編碼(windows下unicode編碼就是指UTF16)。

? ?

UTF16下的每個字符需要是2個或者4個字節。

字符"UTF8"在UTF16下就是"0x55/0x0054/0x0045/0x0038",那為什么圖片中是0x5500呢?這涉及到高字節序和低字節序。開頭的那篇文章也有介紹。字節序僅僅就是先把字符的高位或者低位先放入存儲的而已。

  • 高字節序,高位字節被存在前面
  • 低字節序,低位字節被存在前面
  • ? ?

    比如字符"你""0x4F60",第一個字節是"4F"是"高位",第二個字節是"60"是"低位".

    稍微解釋下為什么左邊是高位,玩笑話就是想想你的銀行賬戶當然是左面數值多才有意義啊。

    那么按照"低字節序" "0x4F60"就被存儲為"60 4F"拉。在intel CPU下默認是"低字節序"。

    ?

    在UTF16下,存儲的字節值和unicode是一一對應的。但是UTF16顯示英文(asni)就浪費一個字節。所以英文國家用UTF8的編碼比較多。反之其他國家用UTF16的較多。

    ? ??

    字節順序標記(BOM)

    不知道你有沒有注意到,在UTF16下的這張圖,地址第0,第1位是"FF FE"

    ?

    ?

    這就是BOM,通過FF FE或者FE FF來告訴解釋器是那種字節序。

    那么你也許會問,為什么UTF8沒有字節序呢?那是因為UTF8是以字節為單位,一個一個字節讀取。UTF16是以字為單位,一個一個字符(2個字節或者4個字節)讀取,這樣就會涉及先讀取第一個或者第二個字節的情況。

    ? ?

    希望這篇文章從存儲字節角度看UTF8和UTF16會為給你帶來不一樣的感覺。

    ?

    總結

    以上是生活随笔為你收集整理的编码(2)从字节理解Unicode(UTF8/UTF16)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲国产日韩一区无码精品久久久 | 亚洲国产网站 | 国产粉嫩av | 国产色吧| 色哟哟在线免费观看 | 偷偷操不一样的99 | 日本少妇中文字幕 | 国产精品果冻传媒 | 亚洲成av人片一区二区梦乃 | 黄色在线免费观看 | 精品国产黄 | 久久久久亚洲av无码麻豆 | 日本福利片在线观看 | 色月婷婷 | 国产精品传媒麻豆hd | 一区二区在线 | 日批视频免费看 | 超碰v | 娇小tube性极品娇小 | 狂野欧美性猛交xxxx巴西 | 理论片中文 | 好吊色免费视频 | 成人在线观看网址 | 蜜臀av在线观看 | 中文文字幕文字幕高清 | av 一区二区三区 | 亚洲无码国产精品 | 色婷婷影院 | 日本久久综合网 | 日本四级电影 | 亚洲AV成人无码网站天堂久久 | 国产午夜电影在线观看 | 日韩亚洲区 | 亚洲男人天堂网 | 艳妇臀荡乳欲伦交换电影 | 国产资源在线免费观看 | 欧美 亚洲 另类 偷偷 自拍 | 一区二区三区精彩视频 | 又白又嫩毛又多15p 超碰在线一区 | 久久久视频在线观看 | 午夜精品999 | 久久性片 | 国产精品老牛影视 | 国产精品国产三级国产a | 有码在线 | 中文字幕日韩欧美 | 青青青在线视频观看 | 少妇裸体淫交视频免费看高清 | 国产精品一区在线观看你懂的 | 青在线视频| 韩国三级hd中文字幕有哪些 | 午夜精品久久久久久久 | 亚洲成熟少妇视频在线观看 | 一级特级黄色片 | 精品国产伦一区二区三区 | 国产chinasex对白videos麻豆 | 欧美肥老妇视频九色 | 日韩视频一区二区三区在线播放免费观看 | 用力抵着尿进去了h | 欧美激情aaa | 国产免费一区二区三区视频 | 欧美国产一二三区 | 亚洲第一国产 | 国产精品一区二区精品 | 亚洲AV午夜精品 | 91亚洲专区 | 人与拘一级a毛片 | 国产黄色一级 | 99国产精品无码 | 欧美一区二区三区视频在线观看 | 黄色大片网站在线观看 | 亚洲精品在线观看av | 伦理片一区二区 | 国产18av | 国产欧美日韩综合精品一区二区三区 | 成人三级在线视频 | 大学生三级中国dvd 日韩欧美一区二区区 | 成人午夜网| 91视频导航 | 91人人干 | 欧美 日韩 人妻 高清 中文 | 国产在线色视频 | 不卡视频在线观看 | 一区二区免费在线观看 | 亚洲色图首页 | www精品一区二区三区 | 日本一级黄色大片 | 亚洲一区视频 | 深夜在线 | 美女露胸无遮挡 | 麻豆精品国产传媒av绿帽社 | 日韩欧美在线中文字幕 | 中文字幕在线视频不卡 | 最新视频在线观看 | 免费成人91| 熟女熟妇伦久久影院毛片一区二区 | 韩国av中文字幕 | 巨乳美女在线 | 国产一区二区久久精品 |