Linuxと文字コード
コンピュータ内部では、文字はすべてバイト列(数値)で表現されています。どの文字をどの数値に対応させるかを規定しているのが文字コードです。たとえば、アルファベットの小文字a
は、ASCIIコードでは数値97
(16進数で61
)で表現されます。この対応関係は、man ascii
コマンドで表示されるASCIIのマニュアルページで確認できます。
ASCIIコードとは
ASCII(American Standard Code for Information Interchange)は、英語のアルファベット、数字、記号、および制御文字を表現する7ビットの文字コード体系です。7ビットで表現できる文字数は 27 = 128 文字で、英語圏で使用される基本的な文字をカバーしています。
実際にどの文字が、どの数値にマッピングされているかは、man ascii
コマンドで確認することができます。
user01@ubuntu:~$ man ascii
出力される内容
ascii(7) Miscellaneous Information Manual ascii(7)
NAME
ascii - ASCII character set encoded in octal, decimal, and hexadec‐
imal
(省略)
Tables │
For convenience, below are more compact tables in hex and decimal.
2 3 4 5 6 7 30 40 50 60 70 80 90 100 110 120
------------- ---------------------------------
0: 0 @ P ` p 0: ( 2 < F P Z d n x
1: ! 1 A Q a q 1: ) 3 = G Q [ e o y
2: " 2 B R b r 2: * 4 > H R \ f p z
3: # 3 C S c s 3: ! + 5 ? I S ] g q {
4: $ 4 D T d t 4: " , 6 @ J T ^ h r |
5: % 5 E U e u 5: # - 7 A K U _ i s }
6: & 6 F V f v 6: $ . 8 B L V ` j t ~
7: ' 7 G W g w 7: % / 9 C M W a k u DEL
8: ( 8 H X h x 8: & 0 : D N X b l v
9: ) 9 I Y i y 9: ' 1 ; E O Y c m w
A: * : J Z j z
B: + ; K [ k {
C: , < L \ l |
D: - = M ] m }
E: . > N ^ n ~
F: / ? O _ o DEL
ASCIIコードの一部一覧
文字 | 10進数 | 16進数 | 2進数 |
---|---|---|---|
A | 65 | 41 | 01000001 |
B | 66 | 42 | 01000010 |
C | 67 | 43 | 01000011 |
a | 97 | 61 | 01100001 |
b | 98 | 62 | 01100010 |
c | 99 | 63 | 01100011 |
0 | 48 | 30 | 00110000 |
1 | 49 | 31 | 00110001 |
2 | 50 | 32 | 00110010 |
! | 33 | 21 | 00100001 |
@ | 64 | 40 | 01000000 |
注: 16進数で61
は10進数で97
に対応します。
日本語の文字コード
ASCIIコードでは128文字しか表現できないため、日本語のように文字数が多い言語を扱うには不十分です。そのため、日本語を表現するための独自の文字コードが開発されました。
主な日本語文字コード
文字コード | 特徴 |
---|---|
EUC-JP | UNIX系システムで広く使われていた日本語文字コード。1文字あたり2バイトで表現。 |
Shift_JIS | Windowsで主に使用されていた文字コード。1文字あたり1~2バイトの可変長。 |
UTF-8 | Unicodeをベースにした可変長の文字コード。多言語対応で現在の主流。 |
UnicodeとUTF-8
Unicodeは、世界中の文字を一つの文字コードで統一して扱うための規格です。Unicodeをエンコードする方式の一つがUTF-8であり、現在多くのシステムで採用されています。
UTF-8の特徴
- 可変長エンコーディングで、1~4バイトで文字を表現。
- ASCIIと互換性があり、ASCIIの文字はそのまま1バイトで表現。
- 世界中の文字を統一的に扱えるため、多言語対応が容易。
Linuxにおける文字コードの変遷
かつて、Linuxで日本語を扱う際にはEUC-JPが主に使用されていました。しかし現在では、Unicodeの普及によりUTF-8がほぼ標準となっています。多くのLinuxディストリビューションでは、インストール時に日本語を選択すると自動的にUTF-8が設定されます。
文字コードの違いによる影響
- 互換性の問題: EUC-JPとUTF-8では文字コードが異なるため、文字化けやファイルの読み込みエラーが発生する可能性があります。
- 多言語対応: UTF-8は多言語対応しており、日本語以外の文字も扱いやすい。
現在の文字コード設定を確認する
自分のシステムで使用されている文字コードは、環境変数LANG
の値で確認できます。シェルからprintenv
コマンドを実行して、LANG
の値を確認してみましょう。
user01@ubuntu:~$ printenv LANG
ja_JP.UTF-8
この場合、日本語(日本)のロケール設定で、文字コードがUTF-8であることを示しています。
他の関連する環境変数
環境変数 | 説明 |
---|---|
LANG | システム全体のロケール設定 |
LC_ALL | ロケール設定の最優先指定 |
LC_CTYPE | 文字の分類や文字コードの設定 |
文字コードの変換方法
異なる文字コード間でファイルを変換するには、iconv
コマンドを使用します。
iconv
コマンドの使い方
【構文】iconv -f <入力文字コード> -t <出力文字コード> <入力ファイル> -o <出力ファイル>
iconv -f <入力文字コード> -t <出力文字コード> <入力ファイル> -o <出力ファイル>
例: EUC-JPで書かれたファイルeucjp.txt
をUTF-8に変換してutf8.txt
として保存する場合
iconv -f EUC-JP -t UTF-8 eucjp.txt -o utf8.txt
オプションの説明
-f
(--from-code
): 変換元の文字コードを指定-t
(--to-code
): 変換先の文字コードを指定-o
(--output
): 出力ファイルを指定
注: 標準入力から変換する場合は、<
を使用します。
iconv -f EUC-JP -t UTF-8 < eucjp.txt > utf8.txt
まとめ
- 文字コードは、文字と数値の対応関係を規定するものです。
- ASCIIコードは7ビットで128文字を表現し、英語の基本的な文字をカバーしています。
- 日本語を扱うために、かつてはEUC-JPやShift_JISが使用されていました。
- 現在では、UTF-8が主流となっており、多くのLinuxディストリビューションで採用されています。
- システムの文字コード設定は、環境変数
LANG
で確認できます。 - 異なる文字コード間の変換には、
iconv
コマンドを使用します。
これからLinuxを使い始める皆さんは、基本的にUTF-8を使用して日本語を扱えば問題ありません。文字コードの違いを理解しておくことで、文字化けなどのトラブルを防ぎ、快適にLinuxを利用できるでしょう。