2011年11月28日月曜日

「文字エンコード」と「ファイルエンコーディング」


windowsの場合はわからないけど、Linux(debian squeeze)でvim使っているとステータスラインのところに[変換済み]と表示されるファイルがあった。

え、いやいや、このファイルは昨日、

 :set fileencoding=utf-8 

ってvimコマンドを打ったから標準文字コードのutf-8で保存されているはずでは....
という事態に陥った。

手元の本やネットで調べると、「文字エンコード」と「ファイルエンコーディング」は別ものらしい。

文字エンコードとは、Shift_JIS, UTF-8, EUC-JP, iso-○○○というやつ。
自然言語の文字をデータで表すための表現の名前
(若干違うけどニュアンスはあってる..)

後者の「ファイルエンコーディング」とは(少なくともvimで言うと)
ファイルを開く時の文字コード らしい。

関連情報は後で書くとして、とりあえずこの記事を見たあなた、若しくは未来の僕はおそらく以下のいずれかの問題について考えていると思う。

1.ファイルが適切な文字コードで表示されていない。
2.今、vimで開いているファイルの文字コードが何なのか知りたい。

1.の問題の簡単な解決方法
linux環境であれば、多分leafpadで問題のファイルを開けばとりあえず適切に表示される。(ほとんどのファイルはね)

leafpadというシンプルなエディタdebian, vine, ubuntu などなら標準のリポジトリに入っていると思うので

 sudo apt-get install leafpad 

と端末をたたけばインストール可能。vineなら
 su 
と端末で打ってrootになってから

 apt-get install leafpad 

でok


2.の問題の簡単な解決方法
ターミナルで

 nkf -g 対象ファイル名 

と打てばok, 文字コードが表示される。


さて、でもちゃんとした解決法も書いておく。

まず予備知識
日本語環境のうちメジャーな文字コードだけでもいくつかあるのに
世界中で使われている文字コードはたくさん。

vim以外のエディタにおいても言えるけど、ここで問題なのはファイルをどの文字コードで開けばよいのか判定する方法である。

100%大丈夫な判別方法をvimは持っていない。
このため、vimの設定ファイルでは fileencodings という設定項目に可能性の高い文字コードの順に書く。
 もしくは一旦ファイルを開いたあと手動でvimコマンドを叩いて、あなたが正しい文字コードでファイルを再読み込みさせればよい。

vimの設定ファイル(ホームフォルダ内の.vimrc)に以下の設定を追加すると問題解決するかも

 set fileencodings=utf-8, iso-2022-jp, euc-jp, cp932 

この設定について解説すると,
vimが文字コード判別不能のファイルを開いた時は
とりあえず utf-8 で開く。
なんか違うとvimが感じたらiso-2022, euc-jp, cp932の順に試していく。という設定。
*ちなみにcp932とはShift_JISをさします。

.vimrcに設定を書き加えるときの注意点
今回紹介した設定項目は「fileencodings」。
でも「encoding」という設定項目がある。

後者(encoding)とはvim内部で用いる文字エンコード。
たとえばMicrosoftのoffice関係は保存の時にどういう保存のしかたをしようが、
WordやExcelのプログラムはShift_JISで動いている(違ったらごめん)。

UNIXやLinuxはUTF-8, たまにEUC-JPで動いているのがほとんんど。
基本的に最近のUNIXやLinuxでは
 set encoding = utf-8 
で良い。


次にvimコマンドで
1.ファイルエンコードを確認する方法,
2.ファイルエンコードの指定方法,
3.文字コードの変換方法
4.ついてに改行コードの指定方法
書いておく


1.ファイルエンコードを確認する方法,
 :set fenc? 
2.ファイルエンコードの指定方法,
 set fileencodings=指定したい文字コード名 
3.文字コードの変換方法
 :setlocal fenc=変換したい文字コード名 
4.ついてに改行コードの指定方法
 :set fileencodings=unix 





2011年11月26日土曜日

zsh


UNIX, linux界隈でのシェルとして有名なのはbash, zsh, tcshあたりだと思う。
ほとんどのlinuxで標準のシェルはbashである。
このため私はbashを使ってきた。
以前zshを使おうと思っていたのだが、研究室のVine Linuxでzshを使うとちょっと問題があったので、とりあえずbashを使っていた。

ところが昨日、zsh使ってみたら、以前起きた問題現象がおきなかったため、zsh使い始めた。

どこがいいのかよくわからないけど、zshはbashやtcshのいいとこどりという言葉をよく聞くから多分いいのだと思う。
twitterでもzsh使っている人がちょこちょこいる。
別にbashに愛着もないし、tcshより後にできたシェルという事もありzshになった。

で、本題。

.zshrcというのがホームディレクトリにある。
これをいじるとbash同様シェル起動時に内容が反映される。

いくつか設定ないようをさらす。
いろんなサイトからコピーした項目ばかり。
aliasの設定は自分で書いたけど。

いまのところzshで便利だと感じたのは
 - viキーバインドでシェルを扱えるということ
 - ファイル名orディレクトリ名のみ打てばディレクトリ移動できること
ぐらい。
これから使い倒していきたい。



# PATHの設定
PATH=/usr/local/bin:$PATH
export PATH

#MANPATHの設定
export MANPATH=/usr/local/share/man:/usr/local/man:/usr/share/man

#言語、文字コードの設定
export LANG=ja_JP.UTF-8

#viキーバインド
bindkey -v

# プロンプトの設定
PROMPT='%~# '

# sudo でも補完の対象
zstyle ':completion:*:sudo:*' command-path /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin

# cdのタイミングで自動的にpushd
setopt auto_pushd

# ディレクトリ名の補完で末尾の / を自動的に付加し、次の補完に備える
setopt auto_param_slash

# ビープ音を鳴らさないようにする
setopt no_beep

# ファイルリスト補完でもlsと同様に色をつける。
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}

# cd をしたときにlsを実行する
function chpwd() { ls }

# ディレクトリ名だけで、ディレクトリの移動をする。
setopt auto_cd

# エイリアスの設定
alias ls='ls --color=auto'
alias ll='ls -ltr'
alias la='ls -A'
alias e='exit'