岸辺のAlbum

teenstの日記

Unicode正規化とtmuxと私

結論

Mac OS Xでtmuxを使っているのだが,濁点と半濁点が表示されなくて若干困ってる.

環境

  • Mac OS X 10.6.7
  • tmux @1.4_2*1
  • zsh-devel @4.3.11_0+mp_completion+pcre
  • $LANG = ja_JP.UTF-8

経緯

元はといえば標準出力で,濁点のついた日本語文字列を表示させてたところ,
何故か濁点が表示されなかった.
大した問題ではなかったため,素通りしていたもののなぜこのようなことになるか,
疑問に思ったため調べてみたが,同じような事例がさっぱり見当たらないため記事にする.
ついでにWebを調べてわかった範囲を記載しておく.

問題の同定

まず,tmuxを使っているため,この症状がでていると考えたため,
tmux上でファイル名に濁点の入るファイルを作り,lsで表示させた.
次にtmuxを抜け,標準状態のiTerm2でもlsを行った.

f:id:teens:20110512224302p:image:medium f:id:teens:20110512224301p:image:medium
左:tmux 右:iTerm2

iTermではなく,OS搭載のTerminalでも同様の現象.

結局の所

zshやtmuxの設定ファイルをきちんと書けばいいだろうと思っていたのだが,どうもそうではないようで.
Unicode正規化というものと深く関わっていると.
濁点の表現方法は,Unicodeの場合「だ」そのものと「だ+゛」を組み合わせた文字,どちらともの表現が可能.
しかし,運用するためにどちらかに統一する必要があるため,前者の1つの文字で正規化する方法をNFC,後者の2つの文字で正規化する方法をNFDと呼ぶ.と.

MacOSXでのファイルシステムはHFS+というものなのだが,ファイル名に関してはNFDが採用されている.しかしプログラムに,この形式を対応させずにNFCのみしか対応させていないと文字化けや表示されないなどという不具合が起きる.
この件については,Macでのバージョン管理ソフトであるSubversionに関わるものが検索ではヒットした.
Unicode正規化は「濁点」「半濁点」「発音記号」に関わる.

例えば上記の標準状態のiTerm2でもlsでは表示できていても,Shellの補完機能では,"だ.txt"というファイルは"た<3099>.txt”と補完されてしまう.

これから

と,まぁここまでは「ファイル名/ディレクトリ名は日本語で付けるべからず」というルールを守っていれば遭遇することはない話だが,gccでコンパイルした実行ファイル上で濁点をを表示できない というのは解決できていない.tmux上のzshで「だ」と入力すると"zsh: command not found: だ"と帰ってくるし,tmux上でのtermtterはきちんと濁点を表示してくれる.それなのに,僕のa.outを実行すると,濁点が標準出力されない.どうしてなのだろう.
ちなみに,アクセント付き文字のファイル名はきちんとlsして表示される.


今のところ本当に困っているわけではないのでこのまま使い続けるが....*2

*1:tmux zsh共にMacPortsで導入

*2:しかしまとめるの下手だな,俺