### 日本語の扱い 日本語の設定を適切に行なうのは、非常に困難です。これは主に以下の理由 によります。 1. Windowsが使っている文字集合は、日本の従来からの標準規格(JIS X 0208) を独自に拡張したものであり、標準に準拠していない このため、規格に厳密な実装では、Windows が使っている文字を完全にサポー トしていません。 2. 日本語を記述するためのエンコード形式が複数使われている 主に歴史的な経緯により、日本語には互いに完全な互換性はない複数のエン コード形式が存在します。主なものとしては、Windows や一部の UNIX が使 用している Shift_JIS と多くの UNIX 系 OS が使用している EUC-JP があ ります。また Samba 2.2 までは、CAP/NetAtalk や日本語ファイル名を利用 できない UNIX との親和性を高めるために CAP や HEX という独自のエンコー ド形式も提供しています。 EUC-JP の実装によっては、仕様上 Windows が使っている文字を完全 にサポートすることができません。 3. Unicode と既存の文字コードとの変換テーブルが複数存在する 既存の文字コードと Unicode との変換テーブルについても、Windows との 互換性を高めたものや、Unicode コンソーシアムの実装例に準拠したもの、 あるいは両者の中間的な実装など何とおりも存在しています。 Unicode コンソーシアムは正式に既存の文字コードとの変換テーブルを定義 していないため、標準といえるものはありません。 4. iconv() 関数の実装がシステムによりまちまちである システムにより iconv() が実装している文字集合や変換テーブルがバラバ ラです。また日本語関連のロケール名についてもシステムにより異なる場合 があります。 このため、文字コード関連のパラメータ設定は、iconv() 関数の関数の実装 やシステムに依存します。 なお、Windows の内部では 2 バイト固定の UCS-2 が使用されていますが、 英語環境で日常的に 1 バイトの ASCII が使われているように、日本語環境 では、いわゆるシフトJIS という符合化形式が日常的に用いられています。 ## パラメータ設定の基本 dos charset および display charset は、Windows 上で用いられている文 字集合、エンコーディングと互換性のあるロケールを用いる必要があります。 これは通常 CP932 という名称ですが、それ以外の名称の場合もあります。 unix charset については、Shift_JIS 系列、EUC-JP 系列、UTF-8 のいずれ かを選択します。UTF-8 は常に使用できますが、それ以外のロケールが使用 可能かどうか、また使用可能な際のロケール名はシステムによって異なりま す。 さらに、Samba 2.2 系列までの coding system = CAP に相当するものとし て、unix charset パラメータに Shift_JIS 系列を選択した上で、vfs_cap モジュールを使用する設定も考慮する必要があります。 unix charset パラメータをどのように設定するかは、頭の痛い問題です。 以下、各方式の特徴を説明した上で、一般的な設定指針を示します。 o Shift_JIS 系列 Shift_JIS 系列は、日本語 Windows で標準的に利用されているロケールを意味します。0x8ba4, 0x974c という 4 バイトのシフトJISエンコー ド形式の日本語文字列に拡張子「.txt」を付加したファイル名を Samba 経 由で設定すると、UNIX 上でのファイル名は Windows と同じ「0x8ba4, 0x974c, ".txt"」(8バイト)のバイナリ文字列になります。 hp-ux、 AIX といった商用 UNIX では、日本語のロケールとして通常 Shift_JIS 系列を利用していますので(ただし、EUC-JP を利用することも可 能です)、 Shift_JIS 系列を選択しておけば Windows 上で作成した日本語 のファイル名を UNIX 上からも参照できます。 これらの UNIX 上ですでに Shift_JIS で運用を行なっており、日本語ファ イル名を利用するユーザがいる場合は、基本的に Shift_JIS 系列を検討す るとよいでしょう。 ただし、表示の際に文字化けが発生したり、非 ASCII 文字のファイル名に 対応していない UNIX 上のツールで問題が発生する可能性があります。特に ファイル名に「\(0x5c)」が含まれる可能性があるため、扱いに注意が必要 となります。このため、極力 UNIX 側で Windows から書き込んだファイル にアクセスしないような運用にすることをお勧めします。 また、日本語対応といわれているフリーソフトウェアの場合でも、実際には EUC-JP にしか対応していない場合も多いため、そのフリーソフトウェアが Shift_JIS 環境で動作するかどうかの確認をした方がよいでしょう。 o EUC-JP 系列 EUC-JP 系列は日本語 UNIX で広く用いられている EUC-JP と呼ばれる業界 標準を実装したロケールを意味します(EUC には EUC-KR など日本語以外の言語に対応し ているものもあります)。0x8ba4, 0x974c という 4 バイトのシフトJISエン コード形式の日本語文字列に拡張子「.txt」を付加したファイル名を Samba 経由で設定すると、UNIX 上でのファイル名は「0xb6a6, 0xcdad, ".txt"」 (8バイト)のバイナリ文字列になります。 オープンソースの Linux、FreeBSD や、Solaris、IRIX、Tru64 UNIX といっ た商用 UNIX では、日本語のロケールとして通常 EUC-JP を利用していま すので(ただし、Solaris では Shift_JIS、UTF-8 を利用することも可能で す。Tru64 UNIX でも Shift_JIS の利用が可能です)、EUC-JP 系列を選択し ておけば Windows 上で作成した日本語のファイル名を UNIX からも参照で きます。更に多くのフリーソフトウェアの日本語対応も、主に EUC-JP に対 応する形で行なわれています。 これらの UNIX 上で日本語ファイル名を利用する場合は、EUC-JP を選択す るとよいでしょう。 ただし、表示の際に文字化けが発生したり、非 ASCII 文字のファイル名に 対応していない UNIX 上のツールで問題が発生する可能性があります。 「\(0x5c)」のような UNIX 上で扱いに注意する必要がある文字はありませ んが、注意が必要です。 また、別途インストールした libiconv を使用して Samba を構築している 場合、libiconv の eucJP-ms と OS の EUC-JP 系列のロケールとで一部の 文字に互換性のない可能性があります。この場合、互換性のない文字につい ては UNIX 側からのアクセスをしないようにするか、ファイル名に利用しな いように運用で回避する必要があります。 o UTF-8 UTF-8 形式は、Unicode コンソーシアムの定めた国際規格の UTF-8 エンコー ド形式です。1*文字*を1〜3バイトで表しますが、日本語の場合は基本的に3 バイトで表記されます。Windows で利用されている Shift_JIS ではもとも と1文字を2バイトで表現しているため、基本的には Shift_JIS のバイト数 の1.5倍のバイト数になります。例えば0x8ba4, 0x974c という 4バイト(2文 字)の日本語文字列に拡張子「.txt」を付加したファイル名を Samba 経由で 設定すると、UNIX 上でのファイル名は「0xe585, 0xb1e6, 0x9c89, ".txt"」 (10バイト)のバイナリ文字列になります。 iconv() が利用できない、もしくは利用はできるが提供しているロケールが Windows と互換性のないため使えない環境の場合、UTF-8 が唯一使用可能な ロケールとなります。 ただし、日本語ファイル名の文字コードとして UTF-8 を標準で使用してい る環境はありません。 また、表示の際に文字化けが発生したり、非 ASCII 文字のファイル名に対 応していない UNIX 上のツールで問題が発生する可能性があります。特にファ イル名に「\(0x5c)」が含まれる可能性があるため、扱いに注意が必要とな ります。このため、極力 UNIX 側で Windows から書き込んだファイルにア クセスしないような運用にすることをお勧めします。 なお、Samba とは直接関係しませんが、Shift_JIS と Unicode との変換テー ブルについても、 UNIX で一般的な iconv() 関数と、Windows また Java などプラットフォームによって微妙な違いがあるため利用に際して注意が必 要です。 なお、Mac OS X ではファイル名のエンコード形式として UTF-8 を利用して いますが、Samba の UTF-8 パラメータが想定している エンコード形式ではないため、一部の文字で不具合が発生してしまい、現状 利用することはできません。 o Shift_JIS 系列 + vfs_cap (CAP 形式) CAP 形式は、CAP や NetAtalk といった Macintosh 用のファイルサーバソ フトウェアで用いられている実装です。0x8ba4, 0x974c という 4 バイトの 日本語文字列に拡張子「.txt」を加えたファイル名を Samba 経由で設定す ると、UNIX 上でのファイル名は「:8b:a4:97L.txt」(14バイト)になります。 文字列を1バイトずつ分割して扱った際に、ASCII 文字として認識できない バイト(0x80以上)については「:xx」という形式を利用して書き込む点が特 徴です。ファイル名に「\(0x5c)」が含まれる可能性があるため、扱いに注 意が必要となりますが、ASCII 文字しか扱えない環境でも文字化けが発生す ることがない点が特徴です。 CAPの最大の長所は、CAP や Netatalk といった Macintosh 用のファイルサー バソフトウェアとのファイル名の互換性にあります。これらのソフトウェア では、通常ファイル名を CAP 形式で UNIX 上に書き込みますので、Samba と Netatalk とで同じUNIX上のディレクトリを公開する場合は、CAP にしな いと非 ASCII のファイル名が文字化けしてしまいます。 ただし、最近では EUC でファイル名を書き込むパッチが適用された Netatalk がインストールされたシステム(日本独自の Vine Linux など)も ありますので、その場合は CAP ではなく EUC-JP 系列を選択する必要が生 じます。 なお、vfs_cap 自体は Shift_JIS 系列以外のエンコード形式でも ASCII 文 字しか使えない環境や、NetAtalk などと共存する必要のある環境で使用す ることが可能です。 Samba 3.0 で CAP 形式を用いるには、以下のように unix charset パラメー タと VFS を併用します。 ----- [global] dos charset = CP932 unix charset = CP932 ... [cap-share] vfs objects = cap (*) CP932 というロケール名は環境によっては異なる可能性があります。 ----- unix charset としては GNU libiconv の場合はShift_JISエンコードを示す CP932 を指定します。上記の設定を行なうことで、cap-share 共有のファイ ル名は、CAP 形式で書き込まれます。 ## 個別の実装 以下個別の実装について紹介します。 o GNU libiconv 日本語を正しく扱うためには、libiconv-1.8 にパッチ(*)を適用することが 必要です。 (*)libiconv-1.8-cp932-patch.diff.gz http://www2d.biglobe.ne.jp/~msyk/software/libiconv-patch.html パッチを適用した libiconv-1.8 では以下の設定が可能です。 dos charset = CP932 unix charset = CP932 / eucJP-ms / UTF-8 | | | +-- EUC-JP 系列 +-- Shift_JIS 系列 display charset = CP932 この他の日本語関連のロケール(Shift_JISやEUC-JPなど)はWindowsとの互換 性が低いため、使用してはいけません。 o GNU glibc Samba で日本語を正しく扱うためには、glibc-2.2.5/2.3.1/2.3.2 にパッチ (*)を適用するか、パッチが統合された glibc-2.3.3 以降を使用する必要が あります。 (*) http://www2d.biglobe.ne.jp/~msyk/software/glibc/ 上記の glibc では、以下の設定が可能です。 dos charset = CP932 unix charset = CP932 / eucJP-ms / UTF-8 display charset = CP932 この他の日本語関連のロケール(Shift_JISやEUC-JPなど)はWindowsとの互換 性が低いため、使用してはいけません。 o Solaris 9 Solaris 付属の iconv() を使用する場合は、以下の設定が可能です。 dos charset = ms932 unix charset = ms932 / - / UTF-8 display charset = ms932 Solaris の iconv() が実装している EUC-JP 系列のロケールは、標準に厳 密に準拠したもののため、Samba では使用できません。 (*) Solaris 9の情報は、未確認です。で、多分 Solaris 附属の iconv は 使えません。 o hp-ux 11i o AIX 5L o Tru64 UNIX 5.1 ## Samba 2.2 系列からの移行 Samba 2.2 系列までは、coding system パラメータにより、Samba 3.0 系列 の unix charset パラメータに相当する設定を行っていました。以下に Samba 2.2 系列から Samba 3.0 系列に移行する場合の対応を示します。 Samba 2.2 の Samba 3.0 の coding system unix charset ------------- ------------ SJIS, Shift_JIS 系列 EUC, EUC-JP 系列 EUC3(*), EUC-JP 系列 CAP, Shift_JIS 系列 + vfs_cap HEX, 現時点ではなし UTF8, UTF-8 UTF8-Mac(*), 現時点ではなし これ以外, なし (*) Samba 日本語版にのみ存在 xxxxx オリジナル版 Samba からの移行や、EUC からの移行時に一部の文字の 互換性がない点に関する注記