how to use ascii table in java
how to use ascii table in java

為什麼 Java 程式碼會碰到 7 位元邊界

標準 ASCII 涵蓋十進位 0 到 127,而 Java 的 char 可以將所有這些代碼點保存為 16 位元不帶正負號的值,這就是為什麼 ASCII 表是撰寫 Java 時很自然的參考依據。Java 更大的 char 範圍 (0 到 65535) 是建立在該 7 位元基礎之上的,所以當你把 char 強制轉型成 int、與像 0x41 之類的字面值比較,或從位元組串流重建一個 String 時,你就是在可見字元與其整數代碼之間進行轉換。ASCII 表讓你能一次查詢這個轉換,同一個代碼以十進位、十六進位、八進位和 7 位元二進位呈現,讓你能依據你的原始碼、記錄檔或通訊協定規格所使用的任一表示法來閱讀。128 列的邊界是刻意的:依據 ECMA-6,標準 ASCII 是一個 7 位元集合,而同一組代碼點在 Unicode Basic Latin 字表中對應到相同的名稱。

舉例來說,大寫 A 的十進位是 65、十六進位是 0x41、八進位是 0o101、二進位是 0b1000001 —— 同一列以四種方式書寫。明確標示進位前綴符合 Java 本身接受整數字面值的方式,這讓該表成為該語言自然的搭配工具,而非泛用的參考資料。

ASCII 表工具實際上顯示了什麼

ASCII 表正好列出代碼位置十進位 0 到 127 共 128 列。每一列將一個可見字元或控制縮寫與同一代碼的四種表示法配對:十進位、兩位數十六進位、三位數八進位和七位數二進位。圖形項目的名稱遵循 Unicode Basic Latin 字表,控制字元的名稱(如 NUL、HT、LF、CR 和 DEL)則採用 RFC 20 的縮寫。分類標籤 —— controls、punctuation、digits、uppercase letters、lowercase letters、Space 或 Delete —— 能縮小檢視範圍,但不會隱藏其他部分。

該表完全在你的瀏覽器中建立與篩選,因此搜尋詞彙和複製的列絕不會離開你的機器。當你在封閉網路中除錯字元資料、審閱可能含有敏感承載的記錄檔,或只是想要快速查詢而不想上傳任何東西時,這個細節很重要。

如何在表中查詢字元的代碼

  1. 開啟該表並瀏覽全部 128 列,或在搜尋框中輸入內容。純數字會被視為十進位讀取,因此輸入 65 就會跳到大寫 A。若要強制使用其他進位,請在數值前加上前綴:十六進位 0x41、八進位 0o101、二進位 0b1000001 —— 這三種都會對應到同一列。
  2. 當你不知道數字時,可依描述搜尋。像是 line feed、question mark、capital letter 或 NUL 等詞彙都能匹配。若要依字面字元搜尋,請加上 char: 前綴,例如 char:space 或 char:0 就能找到你需要的精確項目。
  3. 選擇分類以縮小完整集合的範圍:controls、punctuation、digits、uppercase letters、lowercase letters、Space 或 Delete。所有符合的列都會持續顯示,因此不會有任何資料被悄悄截斷。
  4. 讀取該列以確認十進位、十六進位、八進位和二進位與你的 Java 程式碼所預期的相符。然後選擇 Copy 以可讀的文字格式擷取一整列,用於程式碼註解、錯誤報告或通訊協定註記。

搜尋語法一覽

搜尋框接受 Java 本身所接受的相同表示法,因此你無需在工具之間轉換。下表將每一種輸入格式與其觸發的匹配類型配對在一起。

搜尋輸入匹配的內容
65十進位代碼 65 (大寫 A)
0x41十六進位代碼 0x41 (大寫 A)
0o101八進位代碼 0o101 (大寫 A)
0b1000001二進位代碼 0b1000001 (大寫 A)
char:space字面空白字元 (十進位 32)
NUL十進位 0 的 RFC 20 控制縮寫
line feed十進位 10 的描述或全名

選擇與你的程式碼、堆疊追蹤或參考文件所使用的表示法相符的形式即可。

將該表對應到 Java 的基本資料型別

一旦取得一列資料,下一個問題就是它如何對應到 Java 的基本資料型別。ASCII 範圍夠小,每個相關的 Java 型別都能容納,但在強制轉型時,這些型別的行為並不相同,尤其是在正負號擴展方面。以下的快速對照顯示每個基本型別在 7 位元範圍中的位置。

型別範圍與 ASCII 的關聯
char0 到 65535 (不帶正負號 16 位元)每個 ASCII 代碼點都是有效的 char
byte-128 到 127 (帶正負號 8 位元)十進位 0 到 127 可容納;強制轉型為 int 會對負值進行正負號擴展
int-2,147,483,648 到 2,147,483,647 (帶正負號 32 位元)容納完整的十進位代碼而不溢位
String一連串的 char 值由 ASCII 位元組建構的 String 與其 Unicode 形式完全相同

當你想要對代碼取得乾淨的不帶正負號檢視時,請使用 int;只有在你呼叫的 API —— 例如 socket 讀取、檔案通道、二進位通訊協定 —— 實際傳遞的是位元組時,才使用 byte。

在 Java 程式碼中使用表中的一列

讓該表變得有用的最快方法,是在腦中記住一列作為基準,並在語言中執行來回轉換。大寫 A 是一個方便的基準,因為每種進位表示法都指向同一個整數。

開啟 ASCII 表並確認十進位 65 的那一列:它顯示可見字元 A、十六進位 0x41、八進位 0o101 和 7 位元二進位 0b1000001。在 Java 中,對應的來回轉換如下所示 —— 每一行都會編譯成同一個 int 值 65,而字元也能乾淨地來回轉換,因為 Java 的 char 是不帶正負號的,ASCII 範圍完全落在其中。

  • char letter = 'A'; 將 letter 設為字元 A。
  • int code = (int) letter; 產生 65。
  • char back = (char) code; 傳回 'A'。
  • int inHex = 0x41; 編譯為 65。
  • int inOctal = 0o101; 編譯為 65。
  • int inBinary = 0b1000001; 編譯為 65。

這四個數值字面值確認了該表所使用的進位前綴 (0x、0o、0b) 正好是 Java 編譯器所接受的前綴,因此該列可以直接放進原始碼,無需改寫。同一基準也適用於你查詢的任何其他可列印字母或數字,這讓該表同時作為 Java 整數字面值語法與使用者面向字串中列印字元之間的交叉參考。若要更廣泛地了解 Java 特定的強制轉型、驗證和串流處理,請參閱以 Java 為重點的 ASCII 參考指南

控制代碼、行尾與編碼限制

十進位 0 到 31 以及十進位 127 沒有一般的可列印字形,這就是為什麼該表會在整數代碼旁顯示 NUL、HT、LF、CR 和 DEL 等 RFC 20 縮寫。在 Java 中,這項區分很重要,因為該語言將這些代碼點視為有效的 char,但大多數繪製函式庫會將它們保持為不可見或以替代符號取代。當你在網路追蹤中看到 LF (十進位 10),而在 Windows 文字檔中看到 CR (十進位 13) 時,你看到的是同一個問題 —— 結束一行 —— 的兩種不同慣例,而該表會告訴你代碼,但無法告訴你你的通訊協定預期的是哪一種慣例。

在十進位 127 之後,該表刻意停止。標準 ASCII 是一個 7 位元集合,而位元組 128 到 255 根本不是 ASCII。它們屬於另一種編碼,例如 ISO-8859-1、Windows-1252 或 CP437,而原始的位元組值本身不足以還原出預期的字元。該工具明確標示此限制,以避免在不知情的情況下給出含糊的答案;如果你需要解碼更高的位元組,請先識別產生它們的編碼。Java 的 java.nio.charset API 提供了你接下來會用到的具名編碼,將它與 ASCII 表搭配使用,能讓 7 位元查詢保持嚴謹。

延伸閱讀:ASCII 字表 API 替代方案:在本機端使用 128 個標準代碼