
Linuxコマンドの基本: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 DELASCIIコードの一部一覧
| 文字 | 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を利用できるでしょう。
