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進数
A654101000001
B664201000010
C674301000011
a976101100001
b986201100010
c996301100011
0483000110000
1493100110001
2503200110010
!332100100001
@644001000000
ASCIIコードの一部一覧

: 16進数で61は10進数で97に対応します。

日本語の文字コード

 ASCIIコードでは128文字しか表現できないため、日本語のように文字数が多い言語を扱うには不十分です。そのため、日本語を表現するための独自の文字コードが開発されました。

主な日本語文字コード

文字コード特徴
EUC-JPUNIX系システムで広く使われていた日本語文字コード。1文字あたり2バイトで表現。
Shift_JISWindowsで主に使用されていた文字コード。1文字あたり1~2バイトの可変長。
UTF-8Unicodeをベースにした可変長の文字コード。多言語対応で現在の主流。
主な日本語文字コード

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-JPShift_JISが使用されていました。
  • 現在では、UTF-8が主流となっており、多くのLinuxディストリビューションで採用されています。
  • システムの文字コード設定は、環境変数LANGで確認できます。
  • 異なる文字コード間の変換には、iconvコマンドを使用します。

 これからLinuxを使い始める皆さんは、基本的にUTF-8を使用して日本語を扱えば問題ありません。文字コードの違いを理解しておくことで、文字化けなどのトラブルを防ぎ、快適にLinuxを利用できるでしょう。