HOWTO · Python

在 Python 中將 Unicode 字元轉換為 ASCII 字串

它演示瞭如何在 Python 中將 Unicode 字元轉換為字串

本頁內容

Unicode 字元是所有語言字元的全域性編碼標準。與僅支援每個字元一個位元組的 ASCII 不同,Unicode 字元將此功能擴充套件到 4 個位元組,從而使其支援任何語言的更多字元。

本教程演示瞭如何將 Unicode 字元轉換為 ASCII 字串。目標是刪除 ASCII 不支援的字元,或將 Unicode 字元替換為其相應的 ASCII 字元。

在 Python 中使用 unicodedata.normalize() 和 encode() 將 Unicode 轉換為 ASCII 字串

Python 模組 unicodedata 提供了一種利用 Unicode 和實用程式功能中的字元資料庫的方法,這些功能大大簡化了對這些字元的訪問、過濾和查詢。

unicodedata 具有一個名為 normalize()的函式,該函式接受兩個引數,即 Unicode 字串的規範化形式和給定的字串。

規範化的 Unicode 格式有 4 種型別:NFC,NFKC,NFD 和 NFKD。要了解更多資訊,可以使用官方文件來詳細瞭解每種型別。本教程將全程使用 NFKD 規範化形式。

讓我們宣告一個包含多個 unicode 字元的字串。

import unicodedata

stringVal = u"Här är ett exempel på en svensk mening att ge dig."

print(unicodedata.normalize("NFKD", stringVal).encode("ascii", "ignore"))

呼叫 normalize() 方法後,將呼叫連結到函式 encode(),該函式將完成從 Unicode 到 ASCII 的轉換。

字串值之前的 u 字元可幫助 Python 識別字串值包含 unicode 字元;這樣做是出於型別安全的目的。

第一個引數指定轉換型別,第二個引數強制執行字元無法轉換時應執行的操作。在這種情況下,第二個引數傳遞 ignore,它將忽略任何無法轉換的字元。

輸出:

b'Har ar ett exempel pa en svensk mening att ge dig.'

請注意,原始字串(ä和å)中的 unicode 字元已被其 ASCII 字元對等體(a)取代。

字串開頭的 b 符號表示該字串是位元組文字,因為在字串上使用了 encode() 函式。要刪除符號和封裝字串的單引號,請在呼叫 encode() 之後將其鏈式呼叫 decode(),以將其重新轉換為字串文字。

print(unicodedata.normalize("NFKD", stringVal).encode("ascii", "ignore").decode())

輸出:

Har ar ett exempel pa en svensk mening att ge dig.

讓我們嘗試另一個示例,該示例使用 replace 作為 encode() 函式中的第二個引數。

對於此示例,讓我們嘗試一個字串,該字串具有不包含 ASCII 對應字元的字元。

import unicodedata

stringVal = u"áæãåāœčćęßßßわた"

print(unicodedata.normalize("NFKD", stringVal).encode("ascii", "replace").decode())

此示例字串中的所有字元均未以 ASCII 進行註冊,但可能具有對應的符號。

輸出:

a??a?a?a??c?c?e??????

replace 引數直接將沒有 ASCII 對應的字元替換成問號 ? 符號。如果我們在同一字串上使用 ignore:

print(unicodedata.normalize("NFKD", stringVal).encode("ascii", "ignore").decode())

輸出將是:

aaaacce

總之,要將 Unicode 字元轉換為 ASCII 字元,請使用 unicodedata 模組中的 normalize() 函式和字串的內建 encode() 函式。你可以忽略或替換沒有 ASCII 對應字元的 Unicode 字元。ignore 選項將刪除該字元,而 replace 選項將其替換為問號。