簡體   English   中英

遍歷python中的utf-8字符

[英]Iterate over utf-8 characters in python

我正在使用python 3.6讀取以utf-8編碼的西班牙語文件(因此包括字母ñ)。 我使用utf-8編解碼器打開文件,並且文件已正確加載:在調試時,在加載的文本中可以看到ñ。

但是,當我遍歷字符時,ñ被讀為兩個字符,n和〜。 具體來說,當我跑步時:

for c in text:
        hexc = int(hex(ord(c)), 16)
        if U_LETTERS[lang][0] <= hexc <= U_LETTERS[lang][1] \
            or hexc in U_LETTERS[lang][2:] \
            or hexc == U_SPACE:
                filtered_text+=c

並且文本包含ñ,變量c將其視為n(因此hexc為110而不是241),然后為〜(hexc為771)。 我猜想以這種方式進行迭代時會內部轉換為8位字符。 正確的方法是什么?

提前致謝。

這與Unicode規范化有關。 字母“ñ”可以用代碼點為0xF1(241)的單個字符表示,也可以用兩個字符“ n”和疊加波浪號的組合字符表示,即。 代碼點0x6E和0x0303(110和771)。

這兩種表示字母的方法被認為是等價的 ; 但是,它們在字符串比較中並不相同。 Python提供了通過unicodedata模塊將一種形式轉換為另一種形式的功能。 第一種形式稱為組合 (NFC),第二種形式稱為分解 (NFD)歸一化形式。

一個示例解釋了最簡單的方法:

>>> import unicodedata
>>> '\xf1'
'ñ'
>>> [ord(c) for c in '\xf1']
[241]
>>> [ord(c) for c in unicodedata.normalize('NFD', '\xf1')]
[110, 771]
>>> [ord(c) for c in unicodedata.normalize('NFC', 'n\u0303')]
[241]
>>> 

因此,要解決您的問題,請在進行任何進一步處理之前將所有文本轉換為所需的規范化形式。

注意:Unicode規范化是與編碼分開的問題。 您也可以將它與UTF16或UTF32一起使用。 在分解形式中,您實際上有兩個(或更多)字符(每個字符可能由多個字節表示,具體取決於編碼)。 在顯示設備(終端仿真器,編輯器...)上,將其顯示為單個字母,並在基本字符上方/下方標記。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM