概要

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 を使っておけよ。

以下の記事からリンクされています