cifs/smb プロトコルのコードページ
2006-09-06


CIFS プロトコル または、SMB プロトコルにはコードページの指定が必要だ。いむらさんに勘違いだと指摘された事がある。

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 のままにしておくつもりだ。

前回

[fs]
[ports]

コメント(全1件)
コメントをする


記事を書く
powered by ASAHIネット