読者です 読者をやめる 読者になる 読者になる

目に見えるものがすべてとは限らないんだぜ(Rの話)

R 文字コード

こういう話があります。

タルタロス「・・・聖騎士よ、貴公は純粋過ぎる。民に自分の夢を求めてはならない。支配者は与えるだけでよい

ハミルトン「何を与えるというのだ?

タルタロス「支配されるという特権をだッ!

ハミルトン「馬鹿な事を!

タルタロス「人は生まれながらにして深い業を背負った生き物だ
      幸せという快楽のために他人を平気で犠牲にする・・・
      より楽な生活を望み、そのためなら人を殺すことだって厭わない
      しかし、そうした者でも罪悪感を感じる事はできる
      彼らは思う・・・これは自分のせいじゃない。世の中のせいだ、と
      ならば、我々が乱れた世を正そうではないか。秩序ある世界にしてやろう
      快楽を貪る事しかできぬ愚民には相応しい役目を与えてやろう。全ては我々が管理するのだ!
今の日本を端的に表した名シーンを見つけました

管理社会。それは甘い響きを持った誘惑です。

Rによって管理されたい人がいるのも理解できます。

uribo.hatenablog.com

しかし、私はここで警鐘を鳴らすため、Rの管理を信じていては見えないものがあるという話をしたいと思います(こじつけ)。

それは何かというと…

文字化け

そう、文字化けです。Rで言う文字化けには2種類あります。

  • データが実際おかしい場合
  • 表示がおかしいだけの場合

見た感じ文字化けしているからといって、データがおかしいとは限りません。

ではさっそく文字化けしてみましょう。

UTF-8の文字列を用意します。

a <- enc2utf8("あいうえお")
Encoding(a)
#> [1] "UTF-8"

データがおかしい場合

まず、データがおかしい場合。

いちどrawにして、値をひとつだけ変えてみます。

a_raw <- charToRaw(a)
a_raw
#> [1] e3 81 82 e3 81 84 e3 81 86 e3 81 88 e3 81 8a

a_raw[2] <- as.raw(0xff)
a_char <- rawToChar(a_raw)
Encoding(a_char) <- "UTF-8"
a_char
#> [1] "\xe3\xff\u0082いうえお"

文字化けしてますね。こうなってはもうだめです。元が何の文字だったのか推測するのは困難です。

具体的にこれがどういう場合かと言うと、iconv()とかstringi::stri_conf()とかで間違った文字コード変換をしたときとかです。でもたぶん、あまりないと思います。

表示がおかしい場合

(これは多分Windowsでしか文字化けしません)

次に、表示がおかしい場合です。

Encodingがちゃんと設定されているときは問題ありませんが、Encodingがunknownになると、問答無用でデフォルトのエンコーディングで表示しようとします。Windowsの場合はそのデフォルトがShift-JISなので、文字化けしてしまいます。

Encoding(a) <- "unknown"
a
#> [1] "縺ゅ>縺\x86縺医♀"

でも、中のデータは正しくUTF-8の文字列なので、Encodingを設定しなおせば大丈夫です。

Encoding(a) <- "UTF-8"
a
#> [1] "あいうえお"

だいたいの「文字化け」はこっちな気がします。実際のデータは化けてないので、大丈夫です。Rに文字化けを見せられてもたじろがず、落ち着いてEncodingを設定してみましょう。まだまだ↓のようにEncodingが設定されていないバグに出会うことがあります。

github.com

つまり?

お分かりいただけたでしょうか。

Rの管理を信じて「表示が文字化けしているからこのデータはもうだめだ...」と思い込んでしまう危険性を。

Rが私たちに見せている光景の向こう側にあるものに、自分の目を凝らす大切さを。

管理社会の危険性の一端について気付いていただけたら幸いです。