Linux の 302 (Mixed Environment) 試験対策: 国際化

非英語環境での基本的な構成と命名の概念

複数の OS が混在する環境で英語以外の文字を使用する場合、ロケールが関係してくるため、文字コードとコード・ページについて理解する必要があります。さらに、Linux 環境と Windows 環境では、名前空間を同じように解釈しないことも理解していなければなりません。Samba は国際化をサポートしますが、古い Windows クライアントや Samba 2.x で作業している場合、あるいは Unicode 以外の特定の文字セットを使用しなければならないとしたら、構成を多少調整する必要があります。環境でどのロケールを使用するかによっては、変換ライブラリーを作成したり、変換ライブラリーにパッチをあてたりする必要が生じる場合もあります。この記事から、Linux 環境で国際化を行う方法を学んでください。

Tracy Bost, Consultant and Trainer, Freelance

Author photo - Tracy BostTracy Bost は、経験豊かなソフトウェア開発者兼システム・エンジニアです。彼は Linux オペレーティング・システムの講師およびトレーナーも務めています。RHCE (Red Hat Certified Engineer) および MCSE (Microsoft Certified Systems Engineer) の認定を両方とも取得し、Linux Foundation の活発なメンバーでもあります。貸付産業、不動産、非営利セクターなどの業界に従事してきました。



2011年 11月 04日

この連載について

この連載は Linux システム管理タスクの学習に役立つだけでなく、LPIC-3 (Linux Professional Institute Certification レベル 3) 試験に備えるための教材にもなります。

連載の各記事についての説明とリンクについては、developerWorks の LPIC-3 ロードマップを参照してください。現在進行中のこのロードマップは、LPIC-3 試験の最新の目標 (2010年 11月) を反映しています。完成した記事はその都度ロードマップに追加されていきます。

概要

この記事では、以下の概念について学びます。

  • 文字コードとコード・ページ
  • Windows クライアントで文字セットを扱う方法
  • 変換コード・ライブラリー
  • 国際化に対応した Samba の構成方法

この記事は、LPIC-3 Specialty「302 Mixed Environment Exam」試験の主題 312 の目標 312.6 の試験対策となります。この目標の重要度は 1 です。


前提条件

選択的な LPI-302 試験について

LPIC (Linux Professional Institute Certification) には、さまざまなレベルがあり、レベルが上がるにつれ、より深い知識と経験が必要になってくるという点で、他の多くの認定と似ています。LPI-302 試験は、LPIC レベル階層のレベル 3 に位置する選択的な Specialty 認定試験であり、Linux システム管理に関する高度な知識が求められます。

LPIC レベル -3 (LPIC-3) 認定を取得するには、2 つのレベル 1 試験 (101 と 102)、2 つのレベル 2 試験 (201 と 202)、そして LPIC-3 Core Exam (301) に合格しなければなりません。これらの試験に合格した後、LPI-302 などの選択的な Specialty 認定試験を受けることができます。

この連載記事を最大限に活用するには、Linux の高度な知識と、記事に記載されたコマンドを演習できる実際の Linux システムが必要です。具体的には、この記事では読者が Linux コマンドライン関数の実用的な知識を持っていること、そして「Learn Linux, 302 (Mixed environment): 概念」で説明している Samba の目的について、少なくとも全般的に理解していることを前提とします。記事で説明するアクションを実行するには、Samba ソフトウェアがインストールされている必要があります。さらに、GNU Compiler Collection ライブラリーがインストールされていて、ネットワークとインターネットにアクセスできることも必要です。英語以外の言語での命名に関するテストをするには、ネットワーク内に Windows クライアントがあると役立ちます。


国際化の概要

複数の OS が混在する環境でサービスを提供している場合、おそらくサービスの利用者は自分が普段使用しているロケールでファイルやディレクトリーを操作することを望んでいることでしょう。ロケールとは、ユーザーの言語、国、その他、ユーザーがコンピューター環境で使用して表示できる内容 (各種表記) などの設定を定義する、単なるパラメーターのセットです。ソフトウェアがユーザーのロケールで実行できることを、一般には国際化、あるいは i18n と呼びます。

皆さん独自のフィードを作成してください

新しい記事が追加された際、あるいは内容が更新された際に通知を受けられるように、RSS、Atom、または HTML によるカスタム・フィードを作成することができます。それには、developerWorks RSS フィードにアクセスしてください。対象のゾーンとしては「Linux」を選択し、情報の種類としては「記事」を選択して、キーワードには「Linux Professional Institute」と入力します。そして最後にフィードの種類を選択します。

文字コード

例えば、Linux の Nautilus や Windows の Windows Explorer でコンピューター上のディレクトリーをブラウズしていて、01100001 01110000 01110000 01101100 01101001 01100011 01100001 01110100 01101001 01101111 01101110 01110011 という名前のディレクトリーが見つかったとします。あるいは、コンピューターがこのディレクトリーを 97 112 112 108 105 99 97 116 105 111 110 115、または 61 70 70 6C 69 63 61 74 69 6F 6E 73 として表示したとします。このような場合、2 進数や 10 進数、または 16 進数を読むのに興味があるか、変換プログラムが手元にあるのでない限り、この「applications」という名前から、これが共有ディレクトリーであると察することはできません。けれども、コンピューターは数字を理解します。実際、コンピューターが理解するのは数字だけです。

ありがたいことに、2 進法、16 進法、10 進法、またはその他の数体系を学ばなくても、コンピューターを使用することはできます。変換プログラムが、理解できる言語の文字に変換して表示してくれるためです。この変換のベースとなるのは、文字コードです。文字コードとは、各文字に数字を対応させることで、個々の文字を数字の形式で表現したものです。表 1 に一例として、ある特定のディレクトリーの ASCII (American Standard Code for Information Interchange) 文字コードを記載します。

表 1. 「applications」という名前のディレクトリーの ASCII 文字コード
2 進数10 進数16 進数文字表現
011000019761a
0111000011270p
0111000011270p
011011001086Cl
0110100110569i
011000119963c
011000019761a
0111010011674t
0110100110569i
011011111116Fo
011011101106En
0111001111573s

上記の例は、ロケールで ASCII を使用している場合には参考になりますが、コンピューター・ネットワークのグローバル化に伴い、「自分たちの」ロケール (つまり、自分の国および使用している言語に対応したロケール) で作業したいというユーザーが増えています。

Unicode

Unicode に馴染みがないとしても、最近のオペレーティング・システムやソフトウェアを使用していれば、おそらく Unicode を使用したことがあるはずです。最近では、国際化に関する記事で Unicode に触れていない記事を目にすることはめったにありません。国際化のために最近使用されている文字エンコーディングは、事実上、Unicode です。Unicode で目標としているのは、既存の言語をすべて網羅する抽象文字エンコーディングを提供することによって、各種のコード・ページをあらゆるレベルで置き換えることです。

  • ほとんどの Linux ディストリビューションでは現在、デフォルトで Unicode を使用しています。
  • Samba バージョン 3.x ではデフォルトで Unicode を使用します。
  • 1990年代の終わり頃から、Windows コンピューターではデフォルトで Unicode (UTF-16) を使用するようになっています。

最もよく使用されている Unicode エンコーディングは、UTF-8 です。UTF-8 は ASCII 文字に 1 バイトを使用するため、ASCII で定義された文字コードと同じコード値を持つことができます。ただし、一部の非英語環境では、Unicode を使用できないことも、Unicode が最善のソリューションにはならないこともあります。したがって、Linux システム管理者が各種のコード・ページを理解して操作できることが、後方互換性を維持する上で不可欠です。

コンピューター・ネットワークの初期の頃を振り返ってみてください。当時、ほとんどのソフトウェアは英語を念頭に置いて開発されていました。したがって、コンピューターが標準の ASCII による英語の文字表現を使用していても、何の問題もありませんでした。標準の ASCII では、英語の 1 バイト文字を数値 (0 から 127 までの 10 進数) に割り当てます。その後、フランス語やスペイン語、そして数学の方程式で使われるような文字および記号にも対応する必要性が高まってきたことから、ASCII の拡張が組み込まれることになります。この拡張はさらに 128 個の文字を組み込むために 1 ビットを追加し、128 から 255 までの 10 進数を割り当てられるようにしています。標準の ASCII に対する一般的な拡張には、例として ISO Latin I、IBM で使用している EBCDIC (Extended Binary-Coded Decimal Interchange Code)、そして Microsoft と DOS オペレーティング・システムで使用している拡張 ASCII が挙げられます。

けれども、特定のユーザー環境で ASCII 文字では必要を満たせない、中国語、日本語、ハンガリー語、スロバキア語などの別の言語を使用したい場合もあります。このようなタイプの非英語ロケールを扱えるようにするのが、各種のコード・ページです。

コード・ページ

コード・ページとは、特定の 1 つまたは複数のロケールで使用するための文字セット (レパートリー) で定義されている特定の文字に、数値を対応させたマッピングのことです。コード・ページ (code page) は従来、コード・ページ (codepage)、エンコーディング (encoding)、文字セット (charset、character set)、コード化文字セット (coded character set) として知られています。厳密に言うと、それぞれの名称によって多少異なる意味がありますが、この記事ではコード・ページ、文字セット、エンコーディングという用語を同じ意味で使用します。

中国語、日本語、スロバキア語をはじめ、コード・ページを使用する言語は多数あります。表 2 に、よく使用されるコード・ページをいくつか紹介します。

表 2. 一般的なコード・ページ
コード・ページ表現
850MS-DOS Latin 1 (西ヨーロッパ)
437DOS-US, OEM-US
932MS-DOS 日本語シフト JIS
852ラテン文字を使用する中央ヨーロッパ言語
1252Windows 西ヨーロッパ言語
950MS-DOS 繁体字中国語
65001UTF-8 (Unicode)
28591ISO-8859-1

非英語環境での名前空間の処理

Samba バージョン 2.x には Unicode のサポートがないため、ファイル名の言語文字セットのサポートでは常に特定のロケールのコード・ページを使用します。古い Windows クライアントが使用するのは、(マルチバイトではなく) シングルバイトのコード・ページです。ただし、SMB (Server Message Block)/Linux CIFS (Common Internet File System) プロトコルでは、コード変換のサポートはありません。そのため、Samba が古い Windows クライアントと通信するときには、同じ文字セットを使用する必要があります。

お使いの環境で使用するコード・ページが指定されている場合、以下の Samba 固有の用語について、その基本的な意味を理解しておかなければなりません。

  • unix charset: Linux が内部で使用する文字セット
  • dos charset: Samba が古い Windows クライアントと通信するときに使用する文字セット
  • display charset: 画面上での表示に使用する文字セット

Linux コンピューターに iconv がインストールされている場合には (大抵はインストールされています)、iconv -l コマンドを使用することで、使用可能なコード・ページを確認することができます (リスト 1 を参照)。

リスト 1. 使用可能なコード・ページの一覧 (一部)
[tbost@samba ~]# iconv -l
The following list contain all the coded character sets known.  This does
not necessarily mean that all combinations of these names can be used for
the FROM and TO command line parameters.  One coded character set can be
listed with several different names (aliases).

  437, 500, 500V1, 850, 851, 852, 855, 856, 857, 860, 861, 862, 863, 864, 865,
  866, 866NAV, 869, 874, 904, 1026, 1046, 1047, 8859_1, 8859_2, 8859_3, 8859_4,
  8859_5, 8859_6, 8859_7, 8859_8, 8859_9, 10646-1:1993, 10646-1:1993/UCS4,
  ANSI_X3.4-1968, ANSI_X3.4-1986, ANSI_X3.4, ANSI_X3.110-1983, ANSI_X3.110,
  ARABIC, ARABIC7, ARMSCII-8, ASCII, ASMO-708, ASMO_449, BALTIC, BIG-5,
  BIG-FIVE, BIG5-HKSCS, BIG5, BIG5HKSCS, BIGFIVE, BRF, BS_4730, CA, CN-BIG5,
  CN-GB, CN, CP-AR, CP-GR, CP-HU, CP037, CP038, CP273, CP274, CP275, CP278,
  CP280, CP281, CP282, CP284, CP285, CP290, CP297, CP367, CP420, CP423, CP424,
  CP437, CP500, CP737, CP775, CP803, CP813, CP819, CP850, CP851, CP852, CP855,
  CP856, CP857, CP860, CP861, CP862, CP863, CP864, CP865, CP866, CP866NAV,
  CP868, CP869, CP870, CP871, CP874, CP875, CP880, CP891, CP901, CP902, CP903,
  CP904, CP905, CP912, CP915, CP916, CP918, CP920, CP921, CP922, CP930, CP932,

コンピューターの現行のロケールを表示するには、locale コマンドを使用します。ロケールを変更する必要がある場合には、ディストリビューションのドキュメントでロケール・ファイルが置かれている場所を確認してください。ロケールを変更した後は、リブートする必要があります。リスト 2 に、Linux を実行しているコンピューターのデフォルト・ロケールの例を記載します。

リスト 2. Linux コンピューターのデフォルト・ロケール (Unicode UTF-8)
[tbost@samba ~]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

リスト 2 では、多くのコード・ページ命名規則とは異なり、ロケールが理解しやすい名前で表現されていることに注意してください。

文字セットを扱う

Windows バージョン 9x と Samba 2.x が使用する古い DOS コード・ページの手法では拡張文字セットをサポートすることはできても、複数の文字セットを組み合わせて使用することはできません。例えば、スペイン語、英語、フランス語を一緒に使用することはできません。これらの環境で複数のロケールをサポートするという問題に直面した場合には、この制約事項を覚えておいてください。

非英語ロケールを使用していて、その後 Samba 2.x から Samba 3.x にアップグレードした場合、あるいは Samba のデフォルト・ロケールを変更した場合、ファイル名に特殊文字が含まれるファイルの多くが認識不可能になります。一般に、特殊文字が含まれるファイル名は、文字化けした文字列として表示されます。通常、ウムラウトとアクセント記号は文字化けします。これらの文字は、前に使用していたコード・ページに固有の文字であるためです。

英語以外の文字を使用して Samba サーバーに名前を付けるとしたら、Samba が使用しているロケールが、Linux コンピューターで使われているロケールと同じであることを確認してください。このような場合に Samba 構成を適切に設定するには、unix charset ディレクティブが重要な役割を果たします。


コード変換ライブラリーの使用方法

iconv (libiconv) は、GNU ライセンスによって使用が許諾される、あるエンコーディングを別のエンコーディングに変換するプログラムです。Samba は、Linux コンピューターにインストールされている iconv を利用して、必要な文字セット変換ルーチンを実行します。このツールが行う変換は常に完璧なわけではありませんが、たいていの場合はうまく変換を行います。

文字セットに不一致がある場合、でたらめに並んだ解読不能な文字が表示されることになります。その一方、Linux コンピューターまたは Windows コンピューターのコード・ページでサポートされていない特定の文字に対しては、サポートされていない文字のコードと疑問符 (?) が出力されるはずです。いずれのシナリオでも、Samba ログ・ファイルにエラーが記録されるのが通常なので、問題の原因を突き止めるには、ログ・ファイルが役立ちます。ログ・ファイルにエラーが記録されている場合、Samba サーバー上の特定のコード・ページによって文字コードがどのように変換されるのかを詳しく調査することが必要です。

日本語で使われているような複合マルチバイト文字を使用する場合には、特定のコード・ページをサポートするため、あるいはパッチを適用するために、libiconv ライブラリーを作成しなければならないこともあります。日本語のロケールには、libiconv ライブラリーを作成した後に、パッチを適用するという作業も必要になります。CP932 (shift_jisWindows-31J と呼ばれることもあります) は、日本語用の Microsoft コード・ページです。libiconv ライブラリーには、Windows コード・ページである CP932 を Unicode に変換する CP932 コンバーターがありますが、正しく変換するためにはパッチをあてる必要があります。リスト 3 に、このようなライブラリーを使用する場合のコードを記載します。

リスト 3. CP932 用 libiconv ライブラリーに対してパッチをあて、コンパイルとインストールを実行する
[tbost@samba ~]# wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.tar.gz
[tbost@samba ~]#
 wget http://www2d.biglobe.ne.jp/~msyk/software/libiconv/libiconv-1.13-cp932.patch.gz
[tbost@samba ~]# tar -xvzf libiconv-1.13.tar.gz
[tbost@samba ~]# cd libiconv-1.13
[tbost@samba ~]# gzip -dc ../libiconv-1.13-cp932.patch.gz | patch -p1
[tbost@samba libiconv-1.13]# ./configure --prefix=/usr/local/lib/libiconv
[tbost@samba libiconv-1.13]# make
[tbost@samba libiconv-1.13]# sudo make install
[tbost@samba libiconv-1.13]# /usr/local/lib/libiconv/bin/iconv  -l | egrep -i '(-31j|-ms)'
EUC-JP-MS EUCJP-MS EUCJP-WIN EUCJPMS

リスト 3 の操作の流れは以下のとおりです。

  1. libiconv ソース・コードをダウンロードします。
  2. CP932 のパッチをダウンロードします。
  3. libiconv ソース・コードを解凍して untar を実行します。
  4. 新しく作成された libiconv-1.13 ディレクトリーにカレント・ディレクトリーを変更します。
  5. /usr/local/lib/libiconv ディレクトリーを使用してファイルのインストール先ディレクトリーを構成します。
  6. ソース・コードをコンパイルした後、sudo による権限を使用してツールをインストールします。
  7. パッチが適用されていることを確認します。

既存のファイルおよびディレクトリーの名前を変換する

以前に使用していた文字セットを使ってディレクトリーやファイルに名前が付けられている場合、名前の付け方の一貫性を保つためには、名前に使われている文字セットを変換する必要があるかもしれません。Perl で作成された convmv ツールは、このような文字セット間の変換を上手にこなします。

リスト 4 のコードは、圧縮された tarball をダウンロードしてから、その中身を解凍します。convmv は Perl スクリプトであるため、コンパイルは必要ありません。最後のコマンドは、convmv にすべてのファイルを iso-8859-8 (ラテン文字/ヘブライ文字) から Unicode UTF-8 に再帰的に変換するように命令します。

リスト 4. convmv によるファイル名の変換
[tbost@samba /]# wget http://www.j3e.de/linux/convmv/convmv-1.14.tar.gz
[tbost@samba /]# tar -xzvf convmv-1.14.tar.gz
[tbost@samba /]# cd convmv-1.14
[tbost@samba convmv-1.14]# sudo ./convmv -f iso-8859-8 -t utf8 
-r --notest --replace /applications

国際化に対応した Samba の構成方法

Samba バージョン 3 からは、Unicode がデフォルトのエンコーディングとなっているため、すべてのクライアントとの間で Unicode を使用するようにネゴシエートできれば、構成を変更しなくても国際化に対応することができます。一方、Samba 2.x を使用している場合、あるいはネットワーク上に Samba と通信する古い Windows クライアントが存在する場合には、Samba 構成ファイルを調整して、使用するロケールを指示する必要があります。

適切な文字変換ライブラリーがインストールされていれば、国際化に対応するように Samba を構成するのは簡単です。CIFS プロトコルによる通信では非英語文字セットがサポートされるため、構成を変更する必要はないことを覚えておいてください。

文字セットを使用可能にする

例えば、Samba 3 をスペイン語の Windows クライアントに対応するように構成するとします。異なる言語のロケールを構成するには、該当する dos charset および unix charset パラメーター・オプションを使用します。これ以外の構成は同じです。

文字セットを使用可能にするには、以下の手順に従います。

  1. ベスト・プラクティスとして、smb.conf ファイルのバックアップを作成します。
  2. 任意のテキスト・エディターで smb.conf を開きます。
  3. グローバル設定に、以下のディレクティブを追加します。

      #======================= Global Settings =======================
    
    [global]
    
    dos charset = CP850
    
    unix charset = ISO8859-1

    上記の構成は Windows クライアントでコード・ページ 850 を使用する場合の設定例で、Samba サーバーのロケールは IS08859-1 に設定します。読者の皆さんの構成では、おそらく別のコード・ページとロケールを使用することになるはずです。

  4. 新しい構成をテストして、構文エラーや非サポート文字セットのエラーがないことを確認します。

    [tbost@samba /]# testparm -v
    Load smb config files from /etc/samba/smb.conf
    rlimit_max: rlimit_max (1024) below minimum Windows limit (16384)
    Processing section "[homes]"
    Processing section "[printers]"
    Loaded services file OK.
    Server role: ROLE_STANDALONE
    Press enter to see a dump of your service definitions

    問題がなければ、「Loaded services file OK (ロードされたサービス・ファイルは正常です)」というメッセージが返されます。文字セット変換に関する警告またはエラーが表示された場合には、使用しようとしている文字セットを libiconv がサポートしていることを確認してください。

  5. Samba を再起動するか、構成ファイルをリロードします。

ここで、Windows クライアントに接続して、アクセント記号やその他の非英語文字が含まれるディレクトリーをブラウズしてみてください。

[tbost@samba /]# smbclient -U tbost  //windowsclientname/applications
Enter tbost's password:

上記では、windowsclientname がネットワーク内の Windows クライアントの NetBIOS 名で、applications が Windows クライアント上の共有ディレクトリーです。共有ディレクトリーに接続したら、非英語文字が含まれるディレクトリーやファイルを中に含むディレクトリーにナビゲートして、非英語文字が正しく表示されることを確認してください。

参考文献

学ぶために

議論するために

  • My developerWorks コミュニティーに加わってください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者が主導するブログ、フォーラム、グループ、ウィキを調べることができます。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=768311
ArticleTitle=Linux の 302 (Mixed Environment) 試験対策: 国際化
publish-date=11042011