こにしき(言葉・日本社会・教育)

関西学院大学(2016.04~)の寺沢拓敬のブログです(専門:言語社会学)。

RでShift-JISの文字列をエンコードを(勝手に)変えずに置換する方法

置換等の文字列操作に stringr パッケージはとても便利ですが、Shift-JISには対応していないらしく(よく知らない)、とくに断りもなくUTF-8に変換して処理してくれるようです。

そのため、同パッケージの str_replace() 関数で置換したオブジェクトを、Shift-JIS前提のプログラムに突っ込むと文字化けすることがあるようです。(私の環境では RMeCab がそれでした)。これは、デフォの sub() 関数で置換したときも同様。

解決法は、シンプルで、sub() 関数の引数指定でした。引数に useBytes =T を書き込むと簡単に解決。

ネットを2時間(!)検索しても出てきませんでしたが、マニュアルには書いてありました。マニュアルを最初に読め自分。

ただ、マニュアルには「Shift-JISがー」みたいなことは当然ながら書いてないので、誰かの検索にヒットしてこの記事がお役に立てたら幸いです。

> library(RMeCab)
> library(tidyverse)
> 
> x <- "あいうえお"
> x
[1] "あいうえお"
> RMeCabC(x) %>% unlist()
    動詞   助動詞 フィラー   感動詞 
  "あい"     "う"     "え"     "お" 
> Encoding(x)             #unknown → たぶんShift-JIS
[1] "unknown"
> 
> x1 <- str_replace(x,pat=" ",rep=" ") #stringr パッケージ
> x1
[1] "あいうえお"
> RMeCabC(x1) %>% unlist() #見事文字化け
      名詞       名詞       記号       名詞       記号       名詞       名詞       記号 
      "縺"       "ゅ"       ">"       "縺" "<86><e3>"       "∴"       "縺"     "<8a>" 
> Encoding(x1)             #知らんうちにUTF-8
[1] "UTF-8"
> 
> 
> x2 <- sub(x1,pat="",rep="") # sub() で引数デフォ
> x2
[1] "あいうえお"
> RMeCabC(x2) %>% unlist() #見事文字化け
      名詞       名詞       記号       名詞       記号       名詞       名詞       記号 
      "縺"       "ゅ"       ">"       "縺" "<86><e3>"       "∴"       "縺"     "<8a>" 
> Encoding(x2)             #知らんうちにUTF-8
[1] "UTF-8"
> 
> 
> 
> x3 <- sub(x,pat="",rep="",useBytes=T) # sub()で引数 useBytes指定
> x3
[1] "あいうえお"
> RMeCabC(x3) %>% unlist() #文字化けなし
    動詞   助動詞 フィラー   感動詞 
  "あい"     "う"     "え"     "お" 
> Encoding(x3)             #UTF-8にはなってない
[1] "unknown"
>