置換等の文字列操作に 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" >