cifs/smb プロトコルのコードページ ― 2006年09月06日 11時25分16秒
samba 2 系 では、unicode 自体がサポートされていなかった。それでも samba は shitf-jis から euc-jp への変換を行なえたので、UNIX が Windows のファイルサーバとして、広く使われていた。そのときに、client code page を番号で指定したものである。
# Client codepage setting
# for Western European users
; client code page=850
# for Japanese Users
client code page=932
samba も 3 系統が出ると、iconv を使うようになった。それで、unicode も使えるようになった。一般的に samba で使われる unicode は utf-8 だ。それに伴い、client code page の設定は過去のものとなり新しく、三つの charset の設定が追加された。
display charset = UTF-8
unix charset = UTF-8
dos charset = UTF-8
# dos charset = CP932
dos charset がクライアントと接続したときに使われるコードページだと思っていた。実際に man smb.conf などには、そのような表現で書かれている。日本語しか扱えないのが問題で、samba3 が出たらすぐに移行した組である。そして、UTF-8 を設定し、Windows 2000 などと、問題なく使えていた。
いむらさんに、
samba で指定する UTF-8 は、-E で指定できる : の左側の UTF-8 と同じです。 samba3 では dos charset に CPXXX を指定します。(UTF-8 は指定できません) 「CP932(いわゆる SJIS)にもとづいた通信」というのも、より正確に書くと「Unicode を使わないコードの範囲での通信」となり、日本語環境では必然的に CP932 (いわゆる SJIS)しか使わない通信となります。と指摘された。この答えの意味がよく分からなかったので、今一度、ネゴシエーションでの文字コードがどのように決定されるかを尋ねてみた。
Unicode かそれ以外しかありません。 だから、マウント時や smb.conf の設定にコードページの指定が必要なのです。(msdosfs も同じです) これはもともと混在すること自体想定されていないので人間が手であわせるしかなく、複数言語が混在するような環境のために Unicode での通信がオプション として拡張されたわけです。 両者の大きな違いは Unicode の時はその集合のなかにNULL データが含まれしか も1文字 2byte 固定で、Unicode 以外のときはNULL データが含まれない、ということでしょうか。
つまり、プロトコル上では接続時に、unicode が使えるかを確かめ、使えるようだったら指定されたコードページを使わずに unicode で通信するそうだ。そして、uniocde が使えない場合に、使われるのがクライアントが指定するコードページとなる訳である。
例えば、Windows 2000 が CP932 で samba3 に通信を試みる。samba3 は、dos charset = CP932 でクライアントの接続を待つことになる。そして、samba3 は unicode が使えるので、Windows 2000 とは unicode で通信しようと言うのである。Windows 98 が接続してきた場合は、Windows 98 が unicode を使えないので、unicode では通信できない。そこで、Windows 98 が指定してきた CP932 で接続を確立させる。
samba2 では client codepage に数字しか指定できず、samba3 では自由に指定できるようになって良かったと思っていたが、そうでは無かったらしい。Windows 95 やWindows 98 など unicode が使えない環境では、この dos charset は CPxxx になる必要があると。 dos charset が UTF-8 でも、問題が無かったのは全てのクライアントが unicode を使える特殊な環境だからとのことだ。
いむらさんから、そういう指摘を受けたが、samba3 が dos charset = CP932 とやっても、Windows 2000 などと、正しく unicode で通信できるかの検証はやっていない。今の状態でも、意図した通りに動いているので、わざわざ手間を掛けて個人的には年に数回ぐらいしか使わない samba と Windows で実験する程の気力がでない。CIFS プロトコルを読んで、正しく仕様を理解するには随分と長いので、dos charset = UTF-8 のままにしておくつもりだ。
前回。
コメント
_ bero ― 2006年09月07日 14時27分45秒
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。
トラックバック
このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2006/09/06/512676/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
ちゃいます。クライアントは何も指定しないので、クライアントが期待している文字コードを想定して決め打ちします。
#だから多分Windows 9x日本語版と例えば中国語版で共有したらWindows同士でもファイル名がおかしなことになると思われ
例えば、DOSで作成されたフロッピーやCD-ROMを使う場合、vfatでないフロッピーやJolietでないCD-ROMは文字コードの情報なしでファイル名が入ってるので、unix等ではmount時に文字コードを(想像して)指定する必要があります。
vfatやJolietでは文字コードはunicodeと決まってるので特に指定は必要ありません。(指定してもjoliet部分を優先的に使うので生ファイル名部分は解釈しない)
それと似たようなもんです。