‘文字エンコーディング’ カテゴリーのアーカイブ

lgrepコマンドで再帰的に日本語をファイル検索する

lgrepコマンドをご存知でしょうか。日本語対応ページャlvの付属品で、対象ファイルの文字コードを推定して日本語文字列をうまく見つけてくれるという、優れもののgrepです。

古いプロジェクトだと、プログラムはEUCだけど静的ファイルはSJIS、なんてことがあると思います。そんなときに大活躍です。

grepした結果の文字コード変換も勝手にやってくれるので、grep結果をnkfする必要もありません。至れり尽くせりですね。

そんなlgrepコマンドにも弱点があります。grepで言う-r(再帰的にファイルを検索)オプションが無いのです。どこに書いてあるかわからないエラーメッセージを探す、なんてときに-rは必須ですよね。無いなら作ってしまえ、ということで作ってみました。

alias lgrep-r="find . -type d -name .svn -prune -o -type f -print | xargs lgrep"

上記を.bashrcなり.zshrcなりに書けばlgrep-rコマンド(というかエイリアス)の出来上がりです。私は普段の便利さのために.svnディレクトリを無視するようにしてみましたが、環境に合わせて工夫してみてください。

思いつきで作ったんですが、これは便利!最近UTF-8のプロジェクトオンリーの恵まれた人はともかく、そうでない人にはオススメですよ。

講習会「文字集合と文字エンコーディング」を開催しました

「文字集合と文字エンコーディング」というタイトルで、経験2〜3年目の人をターゲットに社内勉強会を開催しました。文字集合という単語を知っている必要はないですけど、少なくともUTF-8とShift_JISとでは扱える文字の種類数が違うことだけは伝えたかったので、その意味では目標が達成できたと思っています。

まとめ

  • 文字集合とは、扱える文字の集合
    • JIS X 0208なら6000文字くらいの日本語の文字
    • UCS-2なら60000文字くらいの世界中の主要な文字
  • 文字エンコーディングとは、文字の集合をバイト列に直す方式
    • Shift_JISはJIS X 0208(など)を1〜2バイトにする
    • UTF-8はUCS-2を1〜3バイトにする
  • 文字エンコーディング関連のツールを使いこなそう
    • nkfやlvを使いこなそう
    • 日本語を探すならlgrep
    • 最終兵器:hexjaで16進ダンプ

(続きを読む…)

unicode.orgで見つけた文字をUTF-8に変換する方法

タイトルそのままなんですが、まずは私のターミナルを見てください。

ターミナルにU+2620を表示してみたところ

ドクロマークのようなものが表示されています。日頃の行いが悪すぎてターミナルが呪われたようですね!というのは冗談で、unicodeの文字(U+2620)を1文字表示してみたところです。

私の環境はMacOSXとzshですが、zshでは”\xe2″などで任意の1バイトを表現することができます。つまり、IMEから入力できない文字でも、UTF-8表現の3バイトを指定することで任意の文字を表示できます。

unicodeには色々な文字があります。今回はunicode.orgのMiscellaneous Symbolsを見て、U+2620というのが面白い文字だな、ということで見つけてきました。

(続きを読む…)

文字エンコーディングが仲間外れのファイルを素早く見つける方法

プロジェクトに多人数が参加するようになると、なぜかプロジェクトの標準とは異なる文字エンコーディングのファイルがcommitされていることがあります。UTF-8で統一しているはずなのにShift_JISのファイルがある、なんて場合ですね。そこでメンバーの注意力不足を指摘したり、「だから***(自分の使っていないエディタの名前を入れてください)はダメなんだ」とかいう宗教論争に発展させたりというのでは不毛ですよね。簡単に気づく方法があればそれでいいんですよ。

方法は色々あると思いますが、今日はどこのご家庭にも必ずあるnkfを使ってみましょう。最近のnkfには–guessというオプションがあり、文字エンコーディングを推測してくれます。

$ nkf --guess hoge*.txt
hoge1.txt:EUC-JP (LF)
hoge2.txt:UTF-8 (LF)
hoge3.txt:BINARY

これを使えば、変な文字エンコーディングのファイルが隠れていないかどうかすぐにわかります。私はプロジェクトルートディレクトリで以下のようなコマンドを実行しています。

(続きを読む…)