フロントエンドエンジニアでもわかる文字コードのはなし-その1「Shift_JISのはなし」

なぜ文字コードの話なのか

以前から、フロントエンド領域においてたびたび目にする「文字コードが―」的問題に対して、文字コードの何たるかを十分に理解せずに進んできました。
そんな折、アイ・スタジオのフロントエンドエンジニアの中で、コーディング規約を改定することとなり、その中で文字コードのことについても触れる部分が出てきました。

新卒入社者に何を聞かれてもスマートに答えるのが先輩の務めだと感じた新卒2年目の私は、いつもはモヤモヤ止まりだった文字コードについての知識を深堀りにかかりました。
そして調べていくうちに、「BOM」とは何なのか、なぜ「UTF-8」が広く使われているのかなど、よく耳にする文字コードワードに対するモヤモヤしていたものが少しずつ晴れて行きました。

目まぐるしい発展を見せるフロントエンド領域において、今回得た文字コードというシブい知識を皆さんに知ってもらいたいという気持ちから、本記事を執筆するに至りました。

もくじ

– Shift_JISのはなし(本稿)
文字コードのはなし
ASCIIのはなし
– Unicodeのはなし
– UTFのはなし
– BOMのはなし

Shift_JISのはなし

まずは、今ではめっきり出番もなくなった、Shift_JISの話からしたいと思います。

恋に落ちるエディタSublime textですらサポートしていない「Shift_JIS」ですが、古くからある案件において時々頭を悩ますこの文字コード。このShift_JISという文字コード、実は厳密に「Shift_JIS」という意味で使われることが少ないかもしれません。

実は、Shift_JISと言った時、それが何を指しているのかは非常に曖昧です。例えば日本語Windows環境におけるShift_JISは、大抵CP932(= Windows-31J = MS932)のことを指しています。PHPを書く人なら「sjis-win」なんていうのも目にしたことがあるかもしれないですが、これも正式なShift_JISとは異なるものです。
私もSASSのコンパイル時に「Invalid Windows-31J character…」なんてエラーが出たり、Windowsのコマンドプロンプトの文字コードを変更しようとした際に、下図のようにchcpコマンドを打って現在の文字コードを確認、なんてことをしていた時に見たことあるな…くらいの認識でした。

mojiko_01

では、なぜこんなにも様々な呼び方がされているのか、違いはなんなのかということについてお話します。

Shift_JISの歴史

始まりは1982年、紛れも無い純血「Shift_JIS」が誕生しました。

この文字コードに目をつけた当時のMicrosoftは、当時開発していたOSであるMS-DOSの標準日本語コードとしてこれを採用し、「CP932」という管理番号をつけました(したがって、当時はまだ「Shift_JS = CP932」でした)。

この時Microsoftは、このMS-DOSを載せるコンピュータを作っているメーカー(OEMメーカー)に対して、「このCP932をよしなに拡張してくれや」という形を採っており、NECや富士通、IBMなどのメーカーは、CP932に対してそれぞれ独自の拡張を進めていきました。これによって、同じShift_JISという文字コードにもかかわらず、この文字コードで表すことのできる文字がメーカーによって異なる、という状態ができあがりました。

時は流れ、1993年。Microsoftは、のちに日本で大ヒットするOS、Windows 3.1の日本語版を出すにあたり、各OEMメーカーによって多様化したCP932を統合しなければならないと判断しました。そこで、当時の日本市場で大きなシェアを持っていたNECとIBMが独自拡張したCP932の統合に動きます。これを改めてCP932と命名し、Windowsの標準日本語コードとしました。この時、IANA(Internet Assigned Numbers Authority)から、昔に作ったCP932と別物なら別名をつけるべきと指摘を受け、「Windows-31J」という名前をつけてIANAに登録しました(名前の由来は、Windows 3.1 Japanese)。

ちなみにJavaでは、IBMのCP932とWindows-31Jを区別する目的で、Windows-31JのことをMS932と呼ぶことにしているようです。
また、前述のPHPにおけるsjis-winは、このWindows-31Jを指しています。

mojiko_02

Windows-31Jには、丸付き数字やローマ数字など、Shift_JISには存在しない多くの文字を表すことができます。
したがって、例えば丸付き文字が含まれるShift_JIS文書をUTF-8に変換したい といったようなときに、Shift_JISをそのままの意味で捉えて

 といったようなことをすると、文字化けしてしまうといった話題が昔からあるようです。

●この記事を書いた人