コンピュータは0と1からなる値を使用し、この0と1の組み合わせによって様々な処理を行っており、文字も例外ではなく一定の基準でコード化されており、それらの基準が通称文字コードといわれるものです。
◆主な文字コード
ASCII EUC JIS Shift-JIS Unicode UTF-8 UTF-16 |
コンピュータの歴史においてアメリカのAT&T社の傘下にあったベル研究所で1969年~1972年に開発されたOSであるUNIXが、独禁法等の兼ね合いからしばらくの間実費程度で配布されることになった事からUNIXは急速に普及したといわれますが、このUNIXで採用された文字コードもASCIIコードでした。
・ASCII [American Standard Code for Information Interchange]
ASCIIとは、1963年にアメリカ規格協会(ANSI)が定めた文字コード体系で日本語では「情報交換用米国標準符号」と訳されます。
7/8ビット英数字のコード体系の一つで1ビットを符号用残りの7ビットに文字を割り当てたものです。
文字コードは、7ビットで0000000~1111111(2進数)の128のコードを0x00~0x7F(16進数)で表記しています。
※正規表現の文字クラス([a-fA-F0-9]等)ではASCII順に書かないとうまくマッチングが行われない場合もあるようです。
ASCIIコードは、アメリカの米語においてはアルファベット26文字、0~9の数字とその他記号などを含めても十分事足りますが、イギリス英語のポンドがなかったり、他の言語では7ビットでは足りず、後にLatin-1(ISO/IEC 8859-1)など様々な文字コードが生まれることになります。
・EUC [Extended Unix Code]
日本語UNIXシステム諮問委員会の提案に基づいて1985年にAT&T社が定めた、複数バイトの文字を扱う文字コードの枠組みで日本語ばかりではなく複数バイト言語の各国の文字コードが規定されています。
日本語のEUCコードを特に「EUC-JP」「日本語EUC」と呼ぶこともあります。
・JIS [Japan Industries Standard]
日本標準工業規格
・Shift-JIS [Shift Japan Industries Standard]
・Unicode
・UCS [Universal multi-octet coded Character Set]
ISO/IEC 10646-1として定められた国際文字集合で世界の主要な言語で使われる文字のほとんどを収録しています。
32ビット(4バイト)のUCS-4と、その部分集合である16ビット(2バイト)のUCS-2があります。但し、UCS-4はまだほとんど使われていない段階でUnicodeの主要部分を収録しているUCS-2が使われているというのが現状です。
コンピュータ上で扱う際の符号化方式としてはUTFが使われます。
・UTF-8 [8-bit UCS Transformation Format]
「ユーティーエフハチ」などと呼ばれることが多いようです。
UCS-2やUCS-4(Unicode)で定義される文字集合を用いて記述された文字列をバイト列(数値の列)に変換する方式の一つ。UTF-8では1文字を1~6バイトの可変長の数値(バイト列)に変換するようになっていますが、現在定義されているUnicode文字をUTF-8で表現した場合、最長で4バイトのバイト列に変換されます。
UTF-8では、Unicodeの最初の128文字(UCS-2でいうU+0000からU+00FF)を変換した結果がASCIIとまったく同じになるため、従来の処理システムとの親和性が高いという特長があります。
一方、日本語などの文字は元々2バイトだったものが3バイトや4バイトで表現されてしまうため、UTF-16と比べてデータサイズが大きくなってしまうという欠点があります。
このように複数の文字コードが混在し、コンピュータネットワークを介したシステムでは日本語などの多バイト文字を符号化するエンコード、復号化するデコード処理(URLエンコード/URLデコード)が必要になったり、日本語を扱う際に「文字化け」などが発生するのはこのような事情が絡み合っているからです。
もちろん正しく設定すれば回避できるのですが、複雑になっていることは事実です。
日常会話程度であれば、世界中の文字は他バイト文字をASCII2文字で表現する事で16ビット(65,536)で賄う事ができますが、科学技術上の学術計算や歴史的な象形文字などを収める為には、それでも足りなくなりました。
また、今後も新たな地域や言語でウェブが一般的になった時や日常会話だけでなく旧字や非日常語などの事も考慮し、新たな選択肢の必要性が増しています。
これまでの経緯で複雑になってしまった各仕様を満たし、シンプルにすべく考案されたのがUnicodeそして更にこのUnicodeに改良を加えたカタチとなるUTF-8などのコードが存在しますが、コンピュータや周辺装置などを含め、まだデファクトスタンダード(事実上の標準)とはなっていないため、これらを使用する際にはまだ注意が必要です。
UnicodeはWindowsに限っていえば標準仕様となっているようですが。
WebのC/SシステムやCGIなどのscriptにおいて必要性に迫られない限りは、使用する文字コードは一つに限定するとよいと思います。
HMTLやXHTMLで文字コードを指定する場合は<meta>タグを認識するブラウザに限定されますが、以下のように記述します。
<meta http-equiv="Content-Type" content="text/html; charset="Shift-JIS"> |
<meta http-equiv="content-type" content="application/xhtml+xml; charset=euc-jp"/> |
とし、Shift-JISの部分には[jis]や[euc-jp]、[utf-8]などを指定する事ができます。
またPerlでCGIスクリプトを作成してデコード(URLエンコードとデコード)する際は、
$s =~ tr/+/ /; $s =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; |
等とした後、jcode.plを使用(require jcode.pl)して
&jcode::convert(\$s, 'sjis') |
とし、Webシステム内で文字コードを統一すれば文字化けは起こらないでしょう。
ただし、前述の通り、やはり環境(OS・ブラウザ等)には依存しますが。
因みに環境に依存といえば、OSによる改行コードの違いもあります。
◆OSごとの改行コード
UNIX : \n (LF) /ラインフィード MacOS : \r (CR) /キャリッジリターン Windows: \n (CRLF)/キャリッジリターン&ラインフィード |
上記のようにメタ文字で表すと\nや\r、\nとなる部分を場合によっては置換する必要もでてきます。
◆改行コード置換例
$val =~ s/\n/\n/g; |
これはPerlでsedを使用している例「$val」はここでは1行分のデータが格納された変数であり、
$valに「\n」が含まれる場合、全てを「\n」に置換する |
という意味になります。