文字コードについて

■概要

文字コードとは、文字をコンピューターが扱える数値(16進数)に置き換えた対応表のことである。文字コードは、文字集合文字符号化方式によって構成される。

  1. 文字集合(character set) – 表現したい文字の範囲(”あ”、”い”・・・といった文字の集合体)
  2. 符号化方式(encoding) – 文字集合を構成する個々の文字の表現方法(数値の振り方)

(1)により表現したい文字の範囲を定義してから、(2)により個々の文字をコンピュータ上でどういった数値で表現するかを定義する。

■文字化けとは

本来想定されている文字コードとは異なる文字コードで文字が解釈されると、全く別の文字に変換されてしまったりデータに対応する文字が定義されていなくて表示されなかったりする。このことを文字化けと呼ぶ。

■代表的な文字集合

Unicode
Unicodeとは、プラットフォームやプログラム、言語などに依存しないように、世界中の文字に一意な数値を与える文字コードである。
Unicodeは、大手のコンピュータメーカーが参加して設立された非営利団体Unicodeコンソーシアムによって策定された。

UTF-8,UTF-16,UTF-32等の文字符号化方式が使用される。


JIS X 0208
JIS X 0208は、日本語表記、地名、人名などで用いられる6,879図形文字を含む、主として情報交換用の2バイト符号化文字集合を規定する文字集合である。日本工業規格によって作成された。

EUC-JP,Shift_JIS,ISO-2022=JP等の文字符号化方式が使用される。


ISO/IEC 10646
Unicodeでは表現できない文字空間を表わすことができるという点でUnicodeの上位互換であったが、ISO/IEC 10646:2003/Amd.2:2006でUnicode外の領域は「永久に予約」(permanently reserved)と宣言されたことにより、使用できなくなった。

■代表的な符号化方式

ASCII
ASCIIは、7桁の2進数で表すことのできる整数の数値のそれぞれに、大小のラテン文字や数字、英文でよく使われる約物などを割り当てた文字符号化方式である。
1963年6月17日に、American Standards Association(ASA、後のANSI)によって制定された。

ASCIIの一部の文字や記号のコード番号に各国独自の文字を割り当てて各国版文字コードを作成された。この各国版作成のための枠組みは、ISO 646(現ISO/IEC 646)という規格で定められている。


UTF-8
UTF-8とは、世界的にも最もポピュラーな文字コードで、Unicode用の8ビット符号単位の符号化方式である。UTF-8は、ASCIIと互換性を持たせた規格となっているため、一部の文字はASCIIと全く同じである。

符号単位とは、「その文字符号化形式において、意味を持つ最短のビット数」のことを言い、UTF-8 においては 8 ビット = 1 バイトが意味を持つ最短のビット数である。

ASCIIと同じ部分は1バイトで表現し、そのほかの部分を2〜6バイトで表現する可変長の符号化方式となっている。

2〜6バイトについては、1 バイト目の先頭に 1 がどれだけ続くかで、何バイトで文字を表現しているのかがわかる。また、その後の各バイトの先頭には 10 が付くので、バイトの区切りがわかりやすい。

2バイト : 11xxxxxx 10xxxxxx
3バイト : 111xxxxx 10xxxxxx 10xxxxxx
...


UTF-16
16 ビット符号単位の文字符号化形式である。英数と日本語は共に2バイトで表現される。

UTF-16の場合、2バイトで表現できる文字(0x0000~0xD7FF、0xE000~0xFFFF)はそのまま2バイトで表し、それ以降(0x00000000~0x0010FFFF)の文字は4バイトで表す。


Shift_JIS
Shift-JISコード(SJIS)はMicrosoft社により定められたコードです。WindowsMS-DOSMacで使用されている。

半角文字も全角文字も一律2バイト(16ビット)で扱うので、表示された文字数とバイト数が一致するという特徴がある。また文字の前半の8ビットで半角文字か全角文字を区別することが可能である。


EUC-JP
EUC-JPとは、Extended UNIX Code Packed Format for Japaneseの略称で、UNIX上で日本語の文字を扱う場合によく利用されている文字コードである。
主に、漢字を使用する日本、中国、韓国で用いられており、日本語を扱えるように構成した文字コードEUC-JP、韓国語の場合はEUC-KR、簡体字中国語の場合はEUC-CNとなる。

Perlの処理系における文字列の扱い

Perlにおける文字列の扱いは、大きく2つに分けると「Perl 内部表現」と「バイト列 」に分類出来る。

Perl 内部表現はその名の通り Perl が内部的に利用・保持する文字列のことである。「内部表現」「内部文字列」だとか「flagged utf8」とも呼ばれる。内部表現ではない文字列に関して、Perl はバイト列として扱う。

Perlを使用するにあたって文字化けを防ぐ方法

入り口で decodeして,内部ではすべてflagged utf8で扱い、出口でencodeするという基本を守る。

  • decode – バイト列(外部から入力される文字列)を内部表現に変換する処理を指す。
  • encode – 内部表現を指定したエンコーディング方式によりバイト列に変換する処理を指す。

外部から入力される文字列というのは、具体的には「コマンドライン引数」「ファイル」「標準入力」「環境変数」等を指す。

use utf8;
use Encode 'decode';
use Encode 'encode';

# 外部からの入力(コマンドライン引数)
my $str = shift;

# バイト文字列(外部からの入力)を内部文字列に変換
$str = decode('文字コード', $str);

...

# 内部文字列をUTF-8バイト文字列に変換する場合
$str = encode('文字コード', $str);



参考:
文字コード考え方から理解するUnicodeとUTF-8の違い | ギークを目指して
符号化文字集合と文字符号化方式 - 「プログラマのための文字コード技術入門」を読んだ - $shibayu36->blog;
Perl の文字列エンコーディングの話 | Hachioji.pm 日めくりテックトーク
Encodeモジュール - 日本語などのマルチバイト文字列を適切に処理する - Perlゼミ(サンプルコードPerl入門)