julia で UnicodeDecodeError の文字を一気に処理する方法 (オマケ、数字とアルファペットの駆逐方法)

UnicodeDecodeError の出る "helllo \x84 world \xe3 こんにちは" の \x84 だとか、\xe3, \x83 みたいなやつを一挙に駆逐する方法です。

StefanKarpinski さんが、Purging utf-8 bad characters というところで、

julia> filter(isascii, "H∃llø, woℝld.")
"Hll, wold."

というのを書き込んでいらっしゃいました。isascii() を使うと日本語のほとんどが駆逐されます。


julia> filter(isascii, "helllo \x84 world \xe3 こんにちは (^ ^)")
"helllo  world   (^ ^)"

文字列 の解説によると、julia では

全ての整数値が有効なUnicodeコードポイントではありません。しかしパフォーマンスの為に、Juliaは Char() の呼び出しの際に 引数が有効なUnicodeコードポイントであるかをチェックしません。 もし変換された値が有効なコードポイントであるか確認したい場合は、 isvalid() 関数を使用してください。:

とのことです。この isvalid() 関数を使うと一気に駆逐できます。


julia> filter(isvalid, ("helllo \x84 world \xe3 こんにちは (^ ^)"))
"helllo  world  こんにちは (^ ^)"

と、いうことは、!isascii() を使ったら、数字とか、アルファベットを駆逐できるのです。


julia> filter(!isascii, filter(isvalid, ("helllo \x84 world \xe3 こんにちは (^ ^)"))) "こんにちは"

これは、やりすぎかな?

isnumeric() というのを使うと数字が除けます。


julia> filter(!isnumeric, "hello \x84 world \xe3 こんにち8 (^ ^)")
"hello \x84 world \xe3 こんにち (^ ^)"

漢字と平仮名だけ取り出したい人達には絶好の道具ですね。

でも絵文字は駆逐できません。絵文字の駆逐には、python の emoji のお世話になるのが良いでしょう。

B! LINE