我從網頁中提取了以下字串。它似乎以某種方式包含字體樣式,這使得它難以使用。我想使用 Python 將其轉換為普通的無樣式字符。
這是字串:
???????? ???????????? ??????????????????????
uj5u.com熱心網友回復:
該字串中的字符是用于數學排版的特殊 Unicode 代碼點。盡管不應在其他背景關系中使用它們,但許多網頁濫用 Unicode 來創建樣式文本;它在不允許 HTML 樣式的地方最常見(例如 StackOverflow 注釋 :-)
如注釋中所述,您可以使用標準unicodedata模塊的normalize方法將這些 Unicode 字符轉換為普通的無樣式字母字符,以進行“兼容性 ( K) 組合 ( C)”規范化。
unicodedata.normalize("NFKC", "???????? ???????????? ??????????????????????")
有四種歸一化形式,它們結合了兩個軸:
- 組合或分解:某些字符(如
?或?)有自己的 Unicode 代碼點,盡管 Unicode 還包括一種機制——零寬度“組合字符”——將裝飾(“重音”或“波浪線”)應用于任何字符。帶有自己代碼的預組合字符基本上是為了支持舊編碼(如 ISO-8859-x),其中包括這些作為單個字符。例如,?D1在 ISO-8859-1(“latin-1”)中是十六進制的,它被賦予了 Unicode 代碼點U 00D1,以便更容易地轉換希望它是單個字符的程式。Latin-1 還包括 ?(如D5),但不包括T?;在 Unicode 中,我們將 T? 寫為兩個字符:大寫的 T 后跟一個“組合波浪號”(U 0054 U 0303)。這意味著我們可以用兩種方式寫 ?:作為 ?,單個組合碼點 U 00D1,或作為 ?,兩個代碼序列 U 004E U 0303。如果您的顯示軟體經過良好調整,那么這兩種可能性應該看起來相同,并且根據 Unicode 標準,它們在語意上是相同的,但是由于代碼不同,它們不會在逐位元組比較中進行相同的比較。- 組合(C) 歸一化將多代碼序列轉換為其組合的單代碼版本(如果存在);它會將 U 004E U 0303 變成 U 00D1。
- 分解(D)歸一化使用組合字符將組合的單碼字符轉換為語意等效的序列;它會將 U 00D1 變成 U 004E U 0303
- 兼容性(K):某些 Unicode 代碼點的存在僅用于強制特定呈現樣式。這包括您遇到的樣式數學字符,但也包括連字(例如
?)、上標數字 (2) 或字母 (a) 以及一些具有常規含義的字符(μ,意思是“百萬分之一”,不同于希臘字符 μ 或埃符號 ?,它與斯堪的納維亞字符 ? 不同)。在兼容性規范化中,這些字符被更改為基本無樣式字符;在某些情況下,這會丟失重要的語意資訊,但它可能很有用。
所有規范化都將代碼置于“規范”排序中。具有多個組合標記的字符,例如 ?,可以按任一順序使用組合標記書寫。為了更容易地比較包含這些字符的字串,Unicode 有一個指定的組合順序,規范化將重新排列組合字符,以便它們可以很容易地進行比較。(注意,這需要在組合后完成,因為這會改變基本字符。例如,如果基本字符是“?”,分解規范化會將基本字符更改為“c”,然后需要插入 cedilla在組合標記序列中的正確位置。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/355837.html
