Cygwin/ローカライズ/日本語テキストの表示


はじめに [ANCHOR] [EDIT] [TOP]

日本語を含むテキストファイルや標準出力を正しく表示する。
頻出の文字コードについてはなるべく意識しないでも表示できるようにする。


事前準備 [ANCHOR] [EDIT] [TOP]

テスト用に日本語を含むテキストファイルを、
一般的によく使われる文字コードでそれぞれ作っておく。

$ echo 日本語 | vi -c "set fenc=eucjp" -c "w! EUCJP.txt" -c q -
$ echo 日本語 | vi -c "set fenc=sjis" -c "w! SJIS.txt" -c q -
$ echo 日本語 | vi -c "set fenc=utf8" -c "w! UTF8.txt" -c q -
$ ll
total 3
-rw-r--r-- 1 Administrator None  7 Sep 23 16:04 EUCJP.txt
-rw-r--r-- 1 Administrator None  7 Sep 23 16:04 SJIS.txt
-rw-r--r-- 1 Administrator None 10 Sep 23 16:05 UTF8.txt

対象となるコマンド [ANCHOR] [EDIT] [TOP]


lessの代わりにlvを使う [ANCHOR] [EDIT] [TOP]

日本語を含むテキストをlessで開くと文字化けしてしまう。
なお、以下の例にあるlessのオプション-fはバイナリファイル(なぜかそう認識される)を開くときの
確認メッセージを抑止するために便宜上つけただけなので特に意味はない。

$ less -f EUCJP.txt
<C6><FC><CB><DC><B8><EC>

$ less -f SJIS.txt
<93><FA><96>{<8C><EA>

$ less -f UTF8.txt
<E6><97><A5><E6><9C><AC><E8><AA><9E>

このうちSJISだけは--raw-control-charsを付与して正しく表示することができる。

$ less -f --raw-control-chars SJIS.txt
日本語

そもそもlessを使うよりもマルチバイト言語に強いページャであるlvを使ったほうがよい。
読み込みの文字コードはlvが判断してくれるので(たぶん)出力文字コードのみSJISを指定すればよい。
パイプでcatに渡してるのは画面クリアを抑止するための便宜上のもの。

$ lv -Os EUCJP.txt | cat -
日本語

$ lv -Os SJIS.txt | cat -
日本語

$ lv -Os EUCJP.txt | cat -
日本語

上記をエイリアスとして.bash_profileに追加しておく。

1
2
alias less='less -f --show-control-chars'
alias lv='lv -Os'

grepの代わりにlgrepを使う [ANCHOR] [EDIT] [TOP]

ターミナルが送受信する文字コードはデフォルトでSJISなので
普通に日本語でgrepをかけてもSJISのテキストしかヒットしない。

$ grep 日本語 *.txt
SJIS.txt:日本語

そこでlvに付属するlgrepというコマンドを代わりに使う。

  • 入力をSJISで受け取り適切な文字コードに変換しながら検索をかける
  • 相応の文字コードで出力される結果をSJISに変換しなおして表示する
$ lgrep -Ks -Os 日本語 *.txt
EUC.txt:日本語
SJIS.txt:日本語
UTF8.txt:日本語

完全にgrepの代替になるものではない(細かい検索オプションなどがない)ので
lgrepじたいのエイリアスにして.bash_profileに追加しておく。
いわゆるダメ文字を検索する場合はシングルクォートで囲ってやればできるみたい。

1
alias lgrep='lgrep -Ks -Os'

vimの設定 [ANCHOR] [EDIT] [TOP]

vimの日本語テキスト表示に関わる設定としては以下のようなものがある。

  • encoding
  • fileencoding
  • termencoding