字元集與編碼

来源:https://www.cnblogs.com/itbsl/archive/2022/04/19/16165971.html
-Advertisement-
Play Games

一個比特(bit)可以是0,或者是1,8個比特(bit),組成一個位元組(byte)。全為0時代表數字0,全為1時代表數字255。 一個位元組可以表示256個數字,兩個位元組可以表示65536個數字。 更多的位元組,可以有更多的組合,就可以表示更大的數值範圍。 整數可以這麼存,那字元呢?一堆二進位的0和1, ...


一個比特(bit)可以是0,或者是1,8個比特(bit),組成一個位元組(byte)。全為0時代表數字0,全為1時代表數字255。

一個位元組可以表示256個數字,兩個位元組可以表示65536個數字。

更多的位元組,可以有更多的組合,就可以表示更大的數值範圍。

整數可以這麼存,那字元呢?一堆二進位的0和1,怎麼也算不出字母A吧。不能直接表示,那就通過數字中轉一下。只要給它指定一個數值編號,要存儲字元時,就存儲這個數值。要讀取時,按照映射關係找到這個字元。

像這樣收錄許多字元然後給它們一一編號,得到一個字元編號對照表,這就是“字元集”。

ASCII字元集只收錄了128個字元,其擴展字元集也只有256個。(ASCII最初被設計的目的也只是用來映射英文體系所需要的字元)

這在只使用英文的國家貌似沒什麼問題,但是隨著世界的互聯,其它非英語母語的國家該怎麼辦呢?比如漢字、日文等。

針對漢字,最先設計了GB2312字元集、但是GB2312不包含繁體字,所以又設計了BIG5字元集,但是依然有很多字元沒有被收錄,其它國家的字體也不在其中

與其不斷推出收錄更多字元的字元集,還不如本著全球化統一標準的目的,製作一個通用字元集,Unicode學術學會就是這樣做的,這個字元集就是Unicode,它於1990年開始研發並於1994年正式公佈,實現了跨語言跨平臺的文本轉換與處理,字元集促成了字元與二進位的合作。但是有了字元集就萬事大吉了嗎?那怎麼存儲(eggo世界)這個內容呢?

直接的想法是,找到每個字元對應的編號,存成二進位,如果使用unicode字元集,拿到他們的編號,直接組合會得到這樣一大串二進位位

問題出現了,該怎麼知道這一長串內容是要按照下麵的方式劃分的呢?

也可以按照下麵的方式劃分呀

所以,照搬編號的方式,行不通!!!

那現在我們可以知道了,編碼完成之後還需要解決的一個問題是如何劃分字元邊界。

其中一個方法可以這樣,不管編號多大多小,統一按照最長的編碼的來,位數不夠的高位補0嘛

這就是定長編碼,這樣就可以解決字元邊界的問題,但是可以發現,這樣就太浪費記憶體了,而且字元集收錄的符號越多,編號跨度就越大,定長編碼造成的浪費就越顯著,還得再想辦法,定長編碼不行,那就“變長編碼”,小編號少占位元組,大編號多占位元組。

但是怎麼劃分字元邊界呢?來看一種解決方案,如果編號屬於[0,127],就占用一個位元組,且最高位固定標識為0。如果屬於[128,2047],就占用兩個位元組,且有固定標識位110和10,三個以及更多位元組的編碼也遵循這樣的規則

以二進位數字01100101,這個位元組最高位是零,就表示這個字元只占一個位元組,除去標識位,剩下的7位就是該字元的二進位編號,轉換成十進位就是101,對應字元e,“世”字同理。

這樣劃分字元就不成問題了。剛剛我們做的是解碼,現在來編碼試試,世界的“界”字在Unicode字元集中編號為30028,符合區間[2048,65535],所以要占用三位元組,使用下麵這個模板。

然後將編號30028轉換成二進位01110101 01001100,再對應填到模板中

好的,這樣就編碼完成了, 我們剛剛用的其實就是UTF-8編碼,也就是Go語言預設的編碼方式。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 引用 引用的基本使用 作用:給變數起別名 語法:數據類型 &別名 = 原名 引用註意事項 引用必須初始化 引用一旦初始化,就不可以更改(一個別名只能初始化一次:只可以跟一個原名) 引用做函數參數 函數傳參時,可以用引用技術讓形參修飾實參 簡化指針修飾形參 #include<iostream> usi ...
  • Spring 配置文件自定義標簽的前置條件 在上一篇文章https://www.cnblogs.com/redwinter/p/16165274.html Spring BeanFactory的創建過程中瞭解了BeanDefinition的載入和BeanFactory的創建,並且提到了Spring留 ...
  • 本文實現用Python將文本文件自動保存到Excel表格裡面去。 需求 將錦江區.txt 文件中的數據整理到 錦江區.xlsx 的 錦江區 sheet ; 將推薦菜欄位丟棄(保留前面14個欄位) ; 將人均消費中的 ¥ 符號去掉,如果價格為空整條數據都不要; 成果展示 txt文本部分數據 效果 稍微 ...
  • 1.導包(配置pom.xml) 一定要用這個網站:https://mvnrepository.com/ 點擊查看代碼 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.4 ...
  • 控制小數位數 控制數值變大變小 數字轉漢字格式 引入 cn.hutool.core.convert 包 ...
  • 車牌識別在高速公路中有著廣泛的應用,比如我們常見的電子收費(ETC)系統和交通違章車輛的檢測,除此之外像小區或地下 車庫門禁也會用到,基本上凡是需要對車輛進行身份檢測的地方都會用到。 簡介 車牌識別系統(Vehicle License Plate Recognition)是電腦視頻圖像識別技術在車 ...
  • Pillow 圖片處理模塊 Pillow是Python第三方庫,Python2中有一個叫PIL(Python Imaging Library)的標準庫,但不支持Python3,所以一些志願者在PIL的基礎上創建了Pillow,支持Python3。Pillow支持動態圖像編輯。 安裝Pillow pi ...
  • 背景 外媒The Register報道,甲骨文稽查企業用戶,近期開始將把過去看管較鬆散的Java授權加入。 甲骨文針對標準版Java(Java SE)有2種商業授權。2019年4月甲骨文宣佈Java SE用戶需要付費訂閱,才能取得授權及更新,包括Java SE 7、8或11、12。但到同年9月該公司 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...