概要
1日1 Python のお時間です。以前、半角スペースなのに半角スペースではない半角スペースもどきの話を書いたが……
また、正体不明文字に出会っちまった。
x = "デ"
これはデではない。
これは UTF-8-MAC のデだ
このデは、内部的に “テ” と濁点が分かれているデであり、 UTF-8-MAC の文字だ。 Mac の Finder からデをコピーすると取得できる。
Python で、デとデが違うことを突き止めてみよう。
x = "デ" # こっちが問題児。
y = "デ"
print(x == y) # False になる。はァ……?
前回の NBSP (正体不明の半角スペース) は、 ord
関数を使って文字のコードポイントを見ることで、通常の半角スペースとの違いを確認できた。だけど、今回のヤロウは内部的に2文字なので ord 関数がエラーを起こす。これはこれで違いを確認できているとも言えるが。
x = "デ" # こっちが問題児。
y = "デ"
try:
ord(x)
except TypeError as ex:
print(ex)
# ord() expected a character, but string of length 2 found
print(ord(y)) # 12487 (普通のデのほうはコードポイントを確認できる。)
UTF-8-MAC を浄化する
unicodedata.normalize
関数を使うと、これを浄化して UTF-8 へ変換できる。
from unicodedata import normalize
x = "デ" # こっちが問題児。
y = "デ"
# https://docs.python.org/ja/3/library/unicodedata.html#unicodedata.normalize
print(normalize("NFC", x) == y) # True になる。
NFC
という指定が何なのかはよくわからんけれども、まあめでたしめでたし。
……ホントやめてくれと言いたい。良い子のみんなはおとなしく UTF-8 を使っておけよ。