UTF-8

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page UTF-8 and the translation is 100% complete.
Resources

UTF-8は、この例では、シンボル当たり1〜4バイトを使用することを意味する可変長の文字エンコーディングです。UTF-8の最初の1バイトはASCIIに使用されており、これによりこの文字セットはASCIIとの完全な後方互換性を持っています。UTF-8では、ラテン文字に最初の1バイトのみが使用されるため、ASCIIとラテン文字はデータのサイズをほとんど増加させることなく交換可能です。より上位のバイト範囲を割り当てられている日本語のような東洋の文字を使用している人々は、データが50%近く冗長になってしまうために不満を抱いています。

キャラクターエンコード

キャラクターエンコードとは?

コンピュータ自体は印字されたテキストを人間のように理解することができません。コンピュータの場合は、テキストのすべての文字は番号で表されます。伝統的に、(符号化方式、エンコーディング(符号化)、または文字セットとして知られている)文字や記号を表すために使用される数字の各セットのサイズはコンピュータのハードウェア上の限界により制約されていました。

キャラクターエンコードの歴史

最も一般的な(あるいは、少なくとも最も広く受け入れられている)文字セットはASCII(American Standard Code for Information Interchange)です。ASCIIはこれまで作られた中でもっとも成功したソフトウェア標準であると一般的に考えられています。現代のASCIIは1986年に米国規格協会によって標準化されました(ANSI X3.4, RFC 20, ISO/IEC 646:1991, ECMA-6)。

ASCII は厳密に 7 ビット、つまり 2 進法 7 桁で表されるビットパターンであり、10 進法で 0 から 127 までの範囲を提供します。これらには 33 個の目に見えない制御文字が含まれており、そのほとんどは 0 から 31 の間にありますが、最後の制御文字 DEL または delete は 127 です。32 から 126 までの文字は目に見える文字です: スペース、句読点、ラテン文字、そして数字。

ASCII の第8ビットは元々はエラーチェックのためのパリティービットとして使われていました。エラーチェックが不要な場合は0のままになっています。つまり、ASCII においては各文字が1バイトで表わされます。

ASCII は現代英語でやりとりするには十分でしたが、アクセント付きの文字を含む他のヨーロッパの言語で使用する場合はそう簡単にはいきませんでした。ISO 8859 標準はこうした需要に対応すべく開発されました。それらは ASCII に対する後方互換性を有していましたが、8 ビット目を空にするのではなく各エンコーディングで更なる 128 文字 (32 個の制御文字と 96 個の表示可能な文字) を表わすために使用していました。現在のところ ISO 8859 標準には 15 のバリエーションがありますが、ISO 8859 の限界は間もなく明らかになりました。これらの文字セットのうち ASCII 互換のバイト範囲以外では、しばしば各バイトで表現される文字同士で衝突するものがありました。また Microsoft Windows のいくつかのバージョンでは Windows-1252 が使われており、これによって文字エンコーディング間の相互運用がますます複雑になりました。その表示可能文字は ISO 8859-1 の上位セットですが、いくつかの点で異なっています; これらのセットはどれも ASCII との互換性を維持しています。

日本語や韓国語(および比較的小規模な中国語)で使われる EUC (Extended Unix Coding) のような、非ラテン文字用のまったく異なる単一バイトエンコーディングの開発は、さらなる混乱をもたらしました。他のオペレーティングシステムは、たとえば Shift-JIS と ISO-2022-JP のように、同じ言語に対して異なる文字セットをまだ使用していました。キリル文字を見たいユーザーは、失敗に終わった ISO 8859-5 や一般的な Windows-1251 セットなどの他のキリルエンコーディングはもちろんのこと、ロシア語やブルガリア語なら KOI8-R、ウクライナ語なら KOI8-U の中からも選択する必要がありました。これらの文字セットはいずれも ASCII との互換性がほとんどなくなっています。もっとも、KOI8 エンコーディングはキリル文字をラテン文字の順番で配列しているため、8ビット目が失われた場合でもテキストは大文字と小文字が逆になった音訳として ASCII ターミナル上で解読することができます。

これらはいずれも大きな混乱を招き、多言語でのやりとりはほとんど不可能になりました; 特に異なる文字種の間では。それでは Unicode にいってみましょう。

Unicode とは何ですか?

Unicode は伝統的な文字セットの単一バイトという制約を打ち捨てました。これは、65,536のコードポイントについて17の""を用いることで、最大で1,114,112の文字を記述します。"Basic Multilingual Plane"(基本多言語面)または BMP として知られる最初の面には、ユーザーが必要とするであろう文字がほとんどすべて含まれています。多くの人が Unicode は16ビットの文字セットであるという誤った仮定を持っています。

Unicode は多くの異なる方法でマップされていますが、もっとも一般的な2つが UTF (Unicode Transformation Format) と UCS (Universal Character Set) です。UCS の後ろの数がバイト数を表わしているのに対し、UTF の後ろの数は1ユニットあたりのビット数を表わしています。UTF-8 は、その8ビットという透明性により、もっとも広まった Unicode テキストの情報交換法となっています。

UTF-8 ができること

UTF-8によって、ユーザーはデータの冗長さを比較的低く抑えつつ、標準規格に準拠しかつ国際的に受け入れられている多言語環境で作業することができます。電子メール、IRC、またその他ほぼすべてのメディアでインターネットを通じて非ASCII文字を送信する場合には、UTF-8を使うことが推奨されます。それにもかかわらず、多数の人がオンラインでの通信におけるUTF-8をよくないものとみなしています。どんな場合であれ、非ASCIIのUTF-8を使う前に、各チャンネル、メーリングリスト、UsenetグループのUTF-8への態度を知っておいた方が良いでしょう。

Gentoo Linux で UTF-8 をセットアップする

UTF-8 のロケールを見つけ、または作成する

これで Unicode の原則を説明し終わりましたから、ローカルで UTF-8 を使う準備をしていきましょう!

より多くの知識に関心があるユーザー向けに、さらなる解説が Gentoo 地域化ガイドにあります。

次に、ユーザーは選択した言語で UTF-8 ロケールが使用可能か、それともそれを生成する必要があるか、調べなければなりません。

user $locale -a | grep 'en_GB'
en_GB
en_GB.utf8

上のコマンドの出力から、.UTF-8 のような接尾辞で終わっている結果を探してください。似たような接尾辞の付いた結果がない場合、UTF-8 互換のロケールを作成する必要があります。

このコマンドは、小文字でハイフンの無い形式の接尾辞を表示します。glibc はどちらの形式も認識できますが、多くのプログラムはそうではありません。もっともよく使用される例が Xorg です。そのため、いつでも utf8 より UTF-8 を優先して使うのがベストです。

メモ
以下のコードは、選択した言語で利用できるUTF-8ロケールがシステムにない場合にのみ実行してください。

"en_GB"をお望みのロケールに変更してください:

root #localedef -i en_GB -f UTF-8 en_GB.UTF-8

UTF-8 ロケールを含めるもう一つの方法は、それを /etc/locale.gen ファイルに追加してから必要なロケールを locale-gen コマンドで生成する方法です。ロケールは /usr/lib/locale/locale-archive のロケールアーカイブに書き込まれます。

コード /etc/locale.genの行
en_GB.UTF-8 UTF-8
root #locale-gen
 * Generating 1 locales (this might take a while) with 1 jobs
 *  (1/1) Generating en_GB.UTF-8 ...                            [ ok ]
 * Generation complete

ロケールを設定する

新しい UTF-8 ロケールを使用するためには、環境変数を1つセットする必要があります: LC_CTYPE です(必要に応じて、LANG 変数を編集してシステム言語を同様に変更することもできます)。また、これをセットする方法もたくさんあります; システム管理者として特定のユーザーのみ UTF-8 の環境にしたい場合があるでしょう。この場合はそのユーザーの ~/.profile (Bourne shell ユーザーの /bin/sh 向け)、~/.bash_profile または ~/.bashrc (Bourne again shell ユーザーの /bin/bash 向け) でそれらの変数をセットします。詳細やベストプラクティスについては地域化ガイドを見てください。

また、ロケールを全体に設定したい場合もあるでしょう。筆者が特にそうすることを勧めているのが、/etc/init.d/xdm を使用している場合です。なぜなら、この init スクリプトは、前述したどのシェルスタートアップファイルが読み込まれるよりも前にディスプレイマネージャーとデスクトップを開始するからです。言い換えると、xdm は環境にどの変数が読み込まれるよりも早く実行されるのです。

ロケールを全体に設定するには /etc/env.d/02locale ファイルを使う必要があります。このファイルを以下のようにします:

ファイル /etc/env.d/02localeen_GB.UTF-8 の例
## ("en_GB.UTF-8" を適切なロケールの値に変更してください; 言語によって値は異なります!)
LANG="en_GB.UTF-8"
メモ
LANG 変数を LC_CTYPE 変数で置き換えることができます。LC_CTYPE を使用することで影響を受けるカテゴリについての詳細は GNU locale のページを読んでください。

次に、以下のコマンドを実行して環境を更新する必要があります:

root #env-update
>>> Regenerating /etc/ld.so.cache...
root #source /etc/profile

では、locale を引数なしで実行して正しい変数が環境に読み込まれているか見てみましょう:

root #locale
LANG=en_GB.utf8
LC_CTYPE="en_GB.utf8"
LC_NUMERIC="en_GB.utf8"
LC_TIME="en_GB.utf8"
LC_COLLATE="en_GB.utf8"
LC_MONETARY="en_GB.utf8"
LC_MESSAGES="en_GB.utf8"
LC_PAPER="en_GB.utf8"
LC_NAME="en_GB.utf8"
LC_ADDRESS="en_GB.utf8"
LC_TELEPHONE="en_GB.utf8"
LC_MEASUREMENT="en_GB.utf8"
LC_IDENTIFICATION="en_GB.utf8"
LC_ALL=

明示的に設定されているロケール環境変数の値、例えば export 文 (bash を使用している場合) によって設定されているものは、ダブルクォーテーション無しで表示されます。他のロケール環境変数から継承された値は、ダブルクォーテーション付きで表示されます。

代替案: eselect を使ってロケールを設定する

上で説明したようにしてシステムを管理できますが、eselect ユーティリティーを使って正しいロケールが設定されているか調べることもできます。

eselect を使ってシステムで使用可能なロケールを一覧表示するには:

root #eselect locale list
  [1] C
  [2] POSIX
  [3] en_GB.utf8 *
  [ ] (free form)

eselect を使ってロケールを設定するのも、一覧表示と同じくらい簡単です。正しいロケールが特定できたら、以下を実行します:

root #eselect locale set 3
Setting LANG to en_GB.utf8 ...

結果を確認します:

root #eselect locale list
  [1] C
  [2] POSIX
  [3] en_GB.utf8 *
  [ ] (free form)

/etc/env.d/02locale.utf8 ではなく .UTF-8 を含めたい場合には、適切な eselect コマンドを実行します:

root #eselect locale set en_GB.UTF-8
Setting LANG to en_GB.UTF-8 ...
root #eselect locale list
  [1] C
  [2] POSIX
  [3] en_GB.utf8
  [4] en_GB.UTF-8 *
  [ ] (free form)

次のコマンドを実行すると、シェルの変数を更新します:

root #env-update && source /etc/profile
>>> Regenerating /etc/ld.so.cache...

これで全部です。システムは UTF-8 を使用するようになりました。次のハードルは日常的に使用するアプリケーションの設定です。

アプリケーション・ソフトウェアのサポート

Unicode が最初にソフトウェアの世界で勢いを得た頃、マルチバイト文字セットは、ほとんどのよく使われているプログラムでの基本的な言語である C のような言語にはあまり適していませんでした。今日でもいくつかのプログラムは UTF-8 を適切に扱えません。幸いなことに、プログラムの多く、特によく使われているものは、サポートされています。

(V)FAT

FAT ファイルシステムでの UTF-8 サポートについては、FAT の記事を参照してください。

ファイル名

ファイル名のエンコーディングを変える場合には app-text/convmv を使用できます。

root #emerge --ask app-text/convmv

convmv コマンドの書式は以下のとおりです:

root #convmv -f <current-encoding> -t utf-8 <filename>

iso-8859-1 は変換元の文字セットに置き換えてください:

root #convmv -f iso-8859-1 -t utf-8 filename

ファイルの内容を変換するには iconv ユーティリティーを使用します。このユーティリティーは sys-libs/glibc に含まれており、すべての Gentoo システムにインストールされているはずです。iso-8859-1 を変換元の文字セットで置き換えてください。コマンドを実行したら、出力が正常か必ず確認してください:

root #iconv -f iso-8859-1 -t utf-8 filename

ファイルを変換するには、もう一つのファイルを作成する必要があります:

root #iconv -f iso-8859-1 -t utf-8 filename > newfile

recode (app-text/recode) パッケージもこの用途に用いることができます。

システムコンソール

UTF-8 をコンソールで有効にするには /etc/rc.conf を編集します。unicode="yes" をセットしてコメントを読んでください -- Unicode の大部分をカバーする、適切な範囲の文字を含むフォントを用意しておくことが大事です。これを動作させるには、Unicode ロケールが正しく作成されていることを確認してください。

/etc/conf.d/keymaps でセットされている keymap 変数には Unicode キーマップを指定してください。

コード /etc/conf.d/keymaps の断片の例
## ("uk" を正しいローカルのレイアウトに変えてください)
keymap="uk"

ncurses と slang

メモ
Slang がインストールされていなかったり不要な場合は、この節の Slang への言及はすべて無視してください。

unicode/etc/portage/make.conf 内のグローバル USE フラグに追加し、sys-libs/ncursessys-libs/slang を再度 emerge するのが賢明です。--changed-use または --newuse オプションを使用すると、Portage がこれを自動的に行ってくれます。パッケージを導入するには以下のコマンドを実行します:

root #emerge --update --deep --newuse @world

また、USE フラグが適用されたものにリンクしているパッケージも再ビルドする必要があります。使用しているツール (revdep-rebuild) は app-portage/gentoolkit パッケージの一部です。

root #revdep-rebuild --library libncurses.so.5
root #revdep-rebuild --library libslang.so.1

KDE や GNOME、Xfce

主要なデスクトップ環境はすべて Unicode を完全にサポートしており、すでにこのガイドで説明されてきたものの他にはセットアップは不要です。根本的なグラフィカル・ツールキット(Qtか、GTK 2)が UTF-8 を認識しているためです。続いて、これらのツールキットの上で実行されているすべてのアプリケーションも、そのままで UTF-8 に対応しているはずです。


GTK ベースのアプリケーションでは、16 進法による Unicode 入力のためのキーシーケンスは Ctrl+Shift+u+<hex digit>です。例えば、U+2714 の Unicode コードポイントを持つ Unicode 文字 ✔ は Ctrl+Shift+u+2714+ENTER で入力でき、 のように表示されます。


X11 およびフォント

TrueType フォントは Unicode をサポートしており、Xorg に付属するほとんどのフォントは広範囲の文字をサポートしています。しかし、明らかにこれらのフォントでは Unicode にあるすべてのグリフが作成されているわけではありません。

同様に、Portage にあるフォントパッケージの多くも Unicode 対応です。さらなる情報やおすすめのフォント、設定については Fontconfig ページを参照してください。

ウインドウマネージャーおよび端末エミュレーター

GTK や Qt の上に構築されていないウィンドウマネージャーはしばしばフォントの処理に Xft ライブラリを使っているため、一般的に Unicode をとても良好にサポートしています。ウィンドウマネージャーが Xft をフォントに使っていない場合でも、前の節で触れた FontSpec を Unicode フォントとして利用できます。

Xft を使用して Unicode をサポートしているターミナルエミュレーターは見つけるのが困難です。Konsole や GNOME Terminal を除くと、Portage 内の最良の選択肢は x11-terms/rxvt-unicodex11-terms/xfce4-terminalgnustep-apps/terminalx11-terms/mlterm を使うか、または unicode USE フラグを有功にした x11-terms/xtermuxterm を実行することでしょう。screen -U として実行するか以下の行を ~/.screenrc に追加することで、app-misc/screen でも UTF-8 がサポートされます:

コード UTF-8 向けの ~/.screenrc
defutf8 on

Vim や Emacs、Xemacs、nano

Vim は完全な UTF-8 サポートを提供しており、UTF-8 ファイルの検知機能も内蔵されています。Vim についての詳細な情報を得るには :help mbyte.txt を使用してください。

GNU Emacs バージョン 23 以降と XEmacs バージョン 21.5 以降は UTF-8 を完全にサポートしています。GNU Emacs 24 は双方向テキスト (訳註: 右から左へ読む文字と左から右へ読む文字が混在しているテキスト) もサポートしています。

nano はバージョン1.3.6から UTF-8 の完全なサポートを提供しています。

シェル

現在のところ、Bash は GNU readline ライブラリを通じて Unicode の完全なサポートを提供しています。Z Shellunicode USE フラグで Unicode サポートを提供します。

C shell、tcsh および ksh は UTF-8 をサポートしていません。

Irssi

Irssi は UTF-8 を完全にサポートしていますが、ユーザーによるオプション設定が必要です。

[irssi]set term_charset UTF-8

非ASCII文字が UTF-8 以外の文字セットでやりとりされるチャンネルでは、文字を変換するために /recode コマンドが使えるかもしれません。詳細な情報を得るには /help recode と入力してください。

Mutt

Mutt メールユーザーエージェントは Unicode をとても良好にサポートしています。Mutt で UTF-8 を使うために設定ファイルに何かを追加する必要はありません。Mutt は、すべての設定ファイルが(署名も含めて) UTF-8 でエンコードされている場合、何ら変更を加えなくても Unicode 環境で動作します。

メモ
それでも、Mutt で読んでいるメールの中に '?' が現れることがあるかもしれません。これは使用されている文字セットを識別しないメールクライアントを人々が使っているためです。彼らにクライアントを正しく設定するように頼むこと以外に、これに関してできることはほとんどありません。

Mutt Wiki にさらなる情報があります。

links や elinks

よく使われているテキストベースのブラウザがいくつかあるので、それらで UTF-8 サポートを有功にする方法を見ていきましょう。elinkslinks ではそうするための2つの方法があり、1つはブラウザ内からセットアップオプションを使用するもの、もう1つは設定ファイルの編集です。ブラウザから設定を変更するには、elinkslinks でサイトを開いてから Alt+S を押してセットアップメニューに入り、Terminal options を選択するか T を押します。下へスクロールして最後にある UTF-8 I/OEnter で選択します。そうしたら保存してメニューを終了してください。links の場合、保存するためには Alt+S をもう一回押してから S を押す必要があるかもしれません。設定ファイルのオプションは以下のとおりです。

コード elinks/links で UTF-8 を有功にする
## (elinks では /etc/elinks/elinks.conf または ~/.elinks/elinks.conf を編集して以下の行を追加します)
set terminal.linux.utf_8_io = 1
## (links では ~/.links/links.cfg を編集して以下の行を追加します)
terminal "xterm" 0 1 0 us-ascii utf-8

Samba

Samba は Macs、Linux、および FreeBSD のような UNIX システム向けに SMB (Server Message Block) プロトコルを実装しているソフトウェアスイートです。このプロトコルは Common Internet File System (CIFS) と呼ばれることもあります。Samba は NetBIOS システムも含んでいます - これは Windows ネットワークを介したファイル共有のために使われます。

[global] セクションの下に以下を追加します:

root #nano -w /etc/samba/smb.conf
dos charset = 1255
unix charset = UTF-8
display charset = UTF-8

試してみる

UTF-8 のテスト用ウェブサイトは数多くあり、人気がある Gentoo のブラウザ のほとんどは UTF-8 を完全にサポートしています。

テキストのみのWebブラウザのいずれかを使用する場合は、Unicode対応の端末が使用されている絶対に確認してください。

特定の文字が、文字や数字が中に入っている四角形として表示された場合、現在のフォントにはそれらの文字グリフが含まれていません。代わりにその UTF-8 シンボルの16進コードが入った四角形が表示されます。

報告されている問題点

(/etc 内の)システム設定ファイル

システム設定ファイル(たとえば /etc/fstab など)のほとんどは UTF-8 をサポートしていません。これらのファイルについては ASCII 文字セットのままにしておくことをお勧めします。

外部の情報