Java 字元編碼

来源:https://www.cnblogs.com/knhap/archive/2022/12/26/17004896.html
-Advertisement-
Play Games

轉義字元 一些特殊字元。 | 轉義字元 | 含義 | | : : | : : | | \n | 換行 | | \r | 回車 | | \0 | 結束字元 | | \s | 空格 | | \’ | 單引號 | | \" | 雙引號 | | \\ | 反斜杠 | 字元編碼 ASCII American ...


轉義字元

一些特殊字元。

轉義字元 含義
\n 換行
\r 回車
\0 結束字元
\s 空格
\’ 單引號
\" 雙引號
\\ 反斜杠

字元編碼

ASCII

American Standard Code for Information Interchange,美國信息交換標準代碼。

電腦發明之初,基本只考慮了美國的需求,美國大概只需要 128 個字元。

數字 32~126 表示的字元都是可列印字元。

image

0~31 和 127 表示一些不可列印的字元。

數字 縮寫/字元 解釋 轉義字元
0 NUL(null) 空字元 \0
8 BS(backspace) 退格 \b
9 HT(horizontal tab) 水平製表符 \t
10 LF(NL line feed,new line) 換行鍵 \n
13 CR(carriage return) 回車鍵 \r
27 ESC 換碼
127 DEL(delete) 刪除

ASCII 碼對美國夠用,但對其他國家是不夠的。

各國的電腦廠商發明瞭各自的編碼方式以表示自己國家的字元,為了保持與 ASCII 碼的相容性,一般都是將最高位設置為 1。

就是說,當最高位為 0 時,表示 ASCII 碼,當為 1 時就是各個國家自己的字元。

ISO 8859-1

ISO 8859-1 又稱 Latin-1,同樣使用一個位元組表示一個字元。

其中 0~127 與 ASCII 一樣,128~255 規定了不同的含義。

Windows-1252

基本上可以認為,ISO8859-1 已被 Windows-1252 取代,在很多應用程式中,即使文件聲明它採用的是 ISO 8859-1 編碼,解析的時候依然被當作 Windows-1252 編碼。

GBK

GBK 使用固定的兩個位元組表示字元,高位位元組範圍是 0x81~0xFE ,低位位元組範圍是 0x40~0x7E 和 0x80~0xFE。

需要註意的是,低位位元組是從 0x40(即64)開始的,因此低位位元組的最高位可能為 0。

Unicode

Unicode 給世界上所有字元都分配了一個唯一的數字編號,編號範圍從 0x000000~0x10FFFF。

每個字元都有一個 Unicode 編號,這個編號一般寫成十六進位,在前面加 U+。

但它並沒有規定這個編號怎麼對應到二進位表示。

編號怎麼對應到二進位表示?主要有 UTF-32、UTF-16 和 UTF-8 。

UTF-32

字元 Unicode 編號的整數二進位形式,4個位元組。

UTF-16

UTF-16 使用變長位元組表示。對於編號在 U+0000 ~ U+FFFF的字元(常用字元),直接用 2 個位元組表示。編號在 U+10000 ~ U+10FFFF的字元(增補字元集),需要使用 4 個位元組表示。

在 Java 內部進行字元處理時,採用的是 Unicode 編碼,具體的編碼格式是 UTF-16。

UTF-8

UTF-8 使用變長位元組表示,字元使用的位元組個數與其 Unicode 編號的大小有關,編號小的使用的位元組就少,位元組個數為 1~4 不等。

編號範圍 二進位格式
0x00 ~ 0x7F(0 ~ 127) 0xxx xxxx
0x80 ~ 0x7FF(128 ~ 2047) 110x xxxx 10xx xxxx
0x800 ~ 0xFFFF(2048 ~ 65535) 1110 xxxx 10xx xxxx 10xx xxxx
0x10000 ~ 0x10FFFF(65536以上) 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx

UTF-8 將字元看作整數,轉化為二進位形式(去掉高位的 0),然後將二進位位從右向左依次填入對應的二進位格式 x 中,填充完後,如果對應的二進位格式還有沒填的 x,則設為 0。

/*

如 '馬' 的 Unicode 編號是 0x9A6C,整數編號是 39532,二進位 1001 101001 101100

對應的 UTF-8 二進位格式是:1110 xxxx 10xx xxxx 10xx xxxx

將二進位 1001 101001 101100 從右到左依次填入二進位格式中

結果就是其 UTF-8 編碼:1110 1001 1010 1001 1010 1100

*/

UTF-8 是相容 ASCII 的,對大部分中文字元而言,需要使用三個位元組表示。

編碼轉換

不同編碼格式之間可以藉助 Unicode 編號進行編碼轉換。可以認為,每種編碼都有一個映射表,存儲 Unicode 編號和其特有的字元編碼之間的對應關係。

編碼轉換的具體過程可以是:一個字元從 A 編碼轉到 B 編碼,先找到字元的 A 編碼格式,通過 A 編碼的映射表找到其 Unicode 編號,然後通過 Unicode 編號再查找 B 編碼的映射表,找到字元的 B 編碼格式。

亂碼問題

解析錯誤:使用錯誤的編碼進行解析,如小明採用 Windows-1252 寫了個文件,發送給了小紅,小紅 使用 GBK 來解析這個字元,看到的可能就是亂碼。

編碼轉換錯誤:在錯誤解析的基礎上還進行了編碼轉換。如上述,小紅用 GBK 解析打開後看到亂碼,又轉換成了 UTF-8 編碼。


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

-Advertisement-
Play Games
更多相關文章
  • 一個簡單的C#實例。包括:GRPC文件的創建生成、服務端和客戶端函數類庫的封裝、創建服務端和客戶端調用測試。若有錯誤或更好的方法還請指正。 1、創建並生成GRPC服務文件 (1)打開vs2022,創建新項目控制台應用(其他應用好像不行)。 (2)需要安裝三個nuget包,如圖: (3)項目添加新建項 ...
  • 在前面隨筆介紹的基於SqlSugar的WInform端管理系統中,數據提供者是直接訪問資料庫的方式,不過窗體界面調用數據介面獲取數據的時候,我們傳遞的是標準的介面,因此可擴展性比較好。我曾經在隨筆《基於SqlSugar的開發框架循序漸進介紹(5)-- 在服務層使用介面註入方式實現IOC控制反轉》中介... ...
  • 在實際應用開發中,隨著項目業務逐漸複雜,耦合度會越來越高,維護成本也會直線上升,所以解耦也變得越來越重要。Prism框架為WPF開發中解耦提供了非常便捷的應用。今天主要以一個簡單的小例子,簡述WPF開發中Prism框架的簡單應用,如有不足之處,還請指正。 ...
  • AIR32F103CBT6 和 AIR32F103CCT6 分別帶 32K Byte和 64K Byte 記憶體. 對於48pin封裝的 AIR32F103, 32K和64K的記憶體已經是市面上M3晶元中相當不錯的容量, 至於64pin封裝的AIR32F103RPT6, 96K的記憶體只在市場上的高端型號... ...
  • 近年來,有關數據泄露相關的新聞事件屢見不鮮,不斷地引發大眾的討論和擔憂。各家企業都或多或少在承受相關的數據安全風險,這種可能性會給企業運行帶來額外的風險,包括大眾的質疑以及政府的處罰等。 Facebook超5億用戶個人數據遭到泄露; Elector Software投票應用泄露超650萬以色... ...
  • 案例介紹 歡迎來到我的小院,我是霍大俠,恭喜你今天又要進步一點點了!我們來用JavaScript編程實戰案例,製作提高打字速度的小游戲-調皮的字母。點擊與屏幕上字母相對應的按鍵,若按鍵與出現的字母一致,則可以獲得相應的分數。 案例演示 根據屏幕上隨機出現的字母來點擊鍵盤上對應的按鍵,可自行調節字母下 ...
  • 案例介紹 歡迎來的我的小院,我是霍大俠,恭喜你今天又要進步一點點了!我們來用JavaScript編程實戰案例,做一個乘法積分游戲。乘法游戲主要通過用戶輸入的數值和程式計算的數值進行對比,正確積一分,錯誤扣一分。通過實戰我們將學會JSON.parse方法、JSON.stringify方法、localS ...
  • 歡迎來的我的小院,恭喜你今天又要漲知識了! 案例內容 利用JavaScript實現搜索框的移動展開。 演示 學習 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>小院里的霍大俠</title> </hea ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...