Python 對於 0 到 127 之間的每個值都使用與 ASCII 相同的字碼點,因此其內建的 ord() 和 chr() 函式讓你可以直接在字元與美國資訊交換標準碼 (American Standard Code for Information Interchange) 之間進行對應。當 ord('A') 回傳 65 且 chr(65) 回傳 'A' 時,這些數字與 RFC 20 及 ECMA-6 中原始 7 位元 ASCII 標準所定義的十進位、十六進位、八進位和二進位值相同。標準 ASCII 正好涵蓋從十進位 0 開始到十進位 127 結束的 128 個字碼位置;128 到 255 的位元組不屬於標準 ASCII,而是屬於特定編碼的延伸,例如 ISO-8859-1 或 Windows-1252。Python 3 字串以 Unicode 字碼點儲存,這表示 ord() 對於帶有腔調的字母、表情符號或中日韓字元會回傳大於 127 的值。對於 ASCII 相關的工作,例如解析文字檔案、解碼網路封包或建立二進位通訊協定,你需要一份精準的標準值參考資料。ASCII Table 工具提供了這些數值及其經過交叉核對的名稱與前綴,讓你在程式碼中使用之前,能先確認 ord() 實際回傳的內容。

ASCII 與 Python:內建的關聯
Python 對於一般的字串並沒有獨立的「ASCII 類型」,但這個語言的設計使得 Unicode 的前 128 個字碼點與 ASCII 對齊。這並非巧合:Unicode 明確保留了 U+0000 到 U+007F 以保持與 ASCII 相容,這就是為什麼無論你將其視為 ASCII 或 Unicode,每個標準 ASCII 值都表現得一模一樣。
當你對單一個 ASCII 字元呼叫 ord(c) 時,你會得到與嚴格的 ASCII 表所顯示的相同數字。字元 'A' 回傳 65 是因為 Unicode 中的 U+0041 與 ASCII 中的 65 是相同的字碼位置。小寫字母 (a 回傳 97)、數字 ('0' 回傳 48)、標點符號 ('!' 回傳 33),以及像 '\n' (10)、'\t' (9) 和 '\0' (0) 這類不可列印的控制字元也是如此。對於 0 到 127 範圍內的任何整數,chr(i) 都會回傳對應的字元。
這種對齊在實務上很重要。你可以使用 ord() 和 chr() 直接解析純 ASCII 檔案而無需任何特殊模式,使用 ASCII 編解碼器解碼 HTTP 標頭,並將位元組序列寫入網路通訊端,因為每個位元組的低位元部分都遵循 ASCII 標準。若要查詢精確的數值,ASCII Table 工具整理了完整的 128 個條目,其中包含來自 RFC 20 和 Unicode 基本拉丁文圖表 (Basic Latin chart) 的已驗證名稱與帶前綴的進位表示法。
ord() 與 chr():在字元與整數之間轉換
在 Python 中處理 ASCII 碼最直接的兩個工具就是內建的 ord() 和 chr() 函式。
ord(c) 接受一個單字元的字串並回傳其整數字碼點。對於 ASCII 字元,該字碼點就是十進位的 ASCII 值:
- ord('A') 回傳 65
- ord('a') 回傳 97
- ord('0') 回傳 48
- ord(' ') 回傳 32
- ord('\n') 回傳 10
chr(i) 則相反,它會回傳整數字碼點對應的字元:
- chr(65) 回傳 'A'
- chr(97) 回傳 'a'
- chr(48) 回傳 '0'
- chr(32) 回傳 ' '
在 Python 中進行進位轉換,你可以使用內建的 hex()、oct() 和 bin() 輔助函式,它們都會回傳已附加進位前綴的字串:
- hex(65) 回傳 '0x41'
- oct(65) 回傳 '0o101'
- bin(65) 回傳 '0b1000001'
這些與 ASCII Table 中 'A' 那一列所顯示的完全相同。工具和 Python 輸出中的固定寬度前綴可以清楚地表示該值是十六進位、八進位或二進位,因此你絕對不會混淆,例如將 0o101 (十進位 65) 與 101 (十進位一百零一) 搞錯。
Python 的 ASCII 方法一覽
在 ASCII 資料上最常見的 Python 操作符合少數幾種模式。下表以方向、範例運算式和結果來進行彙整。
| 方法 | 方向 | 範例運算式 | 結果 |
|---|---|---|---|
| ord(c) | char → int | ord('A') | 65 |
| chr(i) | int → char | chr(65) | 'A' |
| str.encode('ascii') | str → bytes | 'A'.encode('ascii') | b'A' |
| bytes.decode('ascii') | bytes → str | b'A'.decode('ascii') | 'A' |
| bytes[i] | bytes → int | b'A'[0] | 65 |
| int.to_bytes() | int → bytes | (65).to_bytes(1, 'big') | b'A' |
這六種模式涵蓋了 Python 中大部分日常的 ASCII 工作。前兩種在程式碼中於字元和整數之間轉換;中間兩種在文字和位元組之間進行往返以處理 I/O;最後兩種則用於建構或檢查二進位通訊協定的原始位元組序列。
如何使用 ASCII Table 查詢 ASCII 碼
當你需要精確的 ASCII 值用於文件、程式碼註解或二進位通訊協定時,開啟一份可靠的參考資料比憑空猜測要好。ASCII Table 工具列出了所有 128 個標準字碼位置,其中包含已驗證的十進位、兩位數十六進位、三位數八進位和 7 位元二進位值。
請依照下列步驟查詢任何 ASCII 值:
- 開啟 ASCII Table 並捲動瀏覽完整的 128 列,或使用搜尋框。你可以輸入一個可見字元、一個像 "line feed" 的名稱,或一個像 "LF" 或 "NUL" 的控制字元縮寫。
- 若要依字碼進行精確查詢,請使用正確的前綴輸入值:純數字代表十進位 (輸入 65 可找到大寫 A)、0x 代表十六進位 (輸入 0x41 同樣可找到 A)、0o 代表八進位 (輸入 0o101 又一次可找到 A),或 0b 代表二進位 (輸入 0b1000001 可找到 A)。若要使用明確的字元字面值,請使用 char:value 格式,例如 char:0 或 char:space。
- 使用類別篩選器將表格縮小到控制字元、標點符號、數字、大寫字母、小寫字母、空格 (Space) 或刪除字元 (Delete),當你想要專注於某個範圍時相當實用。
- 同時檢視十進位、十六進位、八進位和 7 位元二進位值,以便在每一種表示法中確認相同的字碼。每一欄中的前綴明確標示了進位,這在讀取網路追蹤記錄或命令列輸出時非常有用。
- 在你所需的那一列選擇複製 (Copy),即可將完整的該列 (包含顯示值、名稱和所有四種數字系統) 放入剪貼簿。複製作業是在你的瀏覽器中於本地端完成,並取決於標準的瀏覽器剪貼簿權限;若權限遭拒,頁面會回報失敗而非假裝成功。
這最後一個步驟對於程式碼註解、錯誤報告、通訊協定說明和教學材料非常有幫助,在這些情境中,你希望讀者能同時看到所有四種表示法,而無需切換工具。相同的方法也適用於 通用 ASCII 程式設計指南 中所涵蓋的更廣泛的程式設計和資料任務。
處理位元組與 ASCII 字面值
Python 中的位元組物件儲存的是小型整數序列,對於 0-127 的範圍,每個整數同時也是一個 ASCII 碼。像 b'A' 這樣的字面值是一個儲存了整數 65 的單一位元組位元組物件,這與 ord('A') 回傳的值相同。
有三種模式會反覆出現。首先,使用 ASCII 編解碼器將字串編碼為位元組會產生一個可預期的位元組物件:'Hello'.encode('ascii') 會產生 b'Hello',因為每個字元都落在 ASCII 範圍內。其次,對位元組物件進行索引會得到整數字碼:b'A'[0] 回傳 65,而 list(b'ABC') 回傳 [65, 66, 67]。第三,當整數位於 ASCII 範圍內時,可以從整數列表建構位元組:bytes([65, 66, 67]) 會回傳 b'ABC'。
如果你嘗試使用 ASCII 編解碼器對大於 127 的字元進行編碼,Python 會引發 UnicodeEncodeError。這是刻意的設計;ASCII 編解碼器強制執行 7 位元的界限,而這個界限正是使 ASCII 成為通用交換格式的原因。當你需要對非 ASCII 字元進行編碼時,你必須選擇不同的編解碼器,例如 'utf-8' 或 'latin-1',而這個選擇會改變你所得到的位元組。
控制字元與特殊碼
ASCII 將十進位 0 到 31 以及十進位 127 保留給控制碼,而非可列印的字符。Python 在原始碼中使用與其 ASCII 值相符的逸出序列來表示這些字元:
- '\0' 是 NUL (十進位 0)
- '\t' 是 HT,即水平定位 (Horizontal Tabulation) (十進位 9)
- '\n' 是 LF,即換行 (Line Feed) (十進位 10)
- '\r' 是 CR,即歸位 (Carriage Return) (十進位 13)
- '\x1b' 是 ESC,即跳脫 (Escape) 字元 (十進位 27)
- '\x7f' 是 DEL,即刪除 (Delete) 字元 (十進位 127)
這些名稱和縮寫遵循 1969 年的原始 ASCII 標準 RFC 20。當你在終端機中列印這些字元或將它們寫入檔案時,它們通常會觸發一個動作 (例如前進一行、移動游標或終止字串),而不是顯示一個字符。
十進位 32 是空格字元 SP,它是一個恰好不可見的可顯示字元。十進位 127 是 DEL,RFC 20 明確指出 DEL 在嚴格意義上並非控制字元;這就是為什麼包括 ASCII Table 工具在內的許多參考資料都將其歸類在獨立的 Delete (刪除) 類別中。SP 和 DEL 在通訊協定和文字處理中都有其各自的角色,而 Python 透過一般的逸出序列 ('\x20' 和 '\x7f') 或字面值 ' ' 和 '\x7f' 來表示它們。
為什麼 ASCII 只到 127
標準 ASCII 是一個 7 位元的字元集,總共提供 128 個字碼位置。較舊的 8 位元位元組中的第八個位元被以許多不同的方式使用:ISO-8859-1、Windows-1252 和 CP437 都為 128 到 255 的值指派了不同的字元。並沒有一個能涵蓋所有這些字元的單一「延伸 ASCII」對應表,而且將這些對應中的任何一個稱為 ASCII 容易產生誤導,因為它們不屬於原始標準的一部分。
在 Python 中,Unicode 字串可以毫無困難地儲存大於 127 的字碼點。ord('é') 回傳 233,ord('中') 回傳 20013,這些都是有效的 Unicode 字碼點,但不是 ASCII 值。當你使用非 ASCII 編解碼器對此類字串進行編碼時,你會得到一個特定的位元組序列,但這些位元組完全取決於編碼方式。這就是為什麼 ASCII Table 工具將自己限制在十進位 0 到 127;若你需要解碼大於 127 的位元組,你必須先知道是哪一種編碼產生了它,而這個決定是解碼問題的一部分,不是僅憑位元組值就能回答的。
Python 中 ASCII 碼實際應用的工作
有幾個常見的工作需要知道確切的 ASCII 值。以整數計算字母在字母表中的位置,比用字元比較更快。對於單一小寫字母 c,公式為 position = ord(c) - ord('a') + 1。代入 c = 'c' 得到 position = 99 - 97 + 1 = 3,因此 'c' 是第三個字母。在日誌檔案中偵測控制字元代表檢查小於 32 或恰好 127 的值,通常在 bytes 物件的迴圈中寫成 if 0 <= b < 32 or b == 127。為網路封包建立固定的二進位標頭代表以已知順序寫入特定位元組,其中每個位元組對應到一個有記載的 ASCII 碼。
對於這些工作中的任何一項,最安全的做法是使用有標準依據的參考資料來驗證數值,而不是依賴記憶。ASCII Table 工具中來自 RFC 20、Unicode Basic Latin 對照表,以及 ECMA-6 的交叉核對值,可以讓這個步驟快速完成。以十進位、十六進位、八進位、二進位、名稱或縮寫搜尋,複製你需要的列,並在離開編輯器之前確認每個碼位。
如果你正在權衡選項,如何在瀏覽器中產生程式碼轉圖片 PNG 詳細介紹了這部分內容。