「プログラマのための文字コード技術入門」IIJ図書館にあるオススメ技術書
2025年06月17日 火曜日

プログラミング、あるいはより広くコンピュータを使用するにあたって避けては通れない文字コード。
しかし、何となくでやり過ごし体系的に学習したことが無い方も多いのではないでしょうか。
書籍情報
https://gihyo.jp/book/2019/978-4-297-10291-3
[改訂新版]プログラマのための文字コード技術入門
矢野啓介著 技術評論社
IIJ asahi です。IIJが開発した高機能ルータ「SEIL」シリーズのファームウェア開発を行っているエンジニアです。
今回は、IIJの社員が社内で自主的に運用する「IIJ図書館」に置いてあるオススメ技術書紹介ということで、「プログラマのための文字コード技術入門」を取り上げます。
文字コードとは
ご存じの方も多いかと思いますが、改めて文字コードの概要を説明します。
コンピュータ内部では、すべてのデータが0と1のビット列で表現されます。そのため、文字を扱うには、何らかの方法で数値に変換する必要があります。文字コードとは、文字と数値の対応関係(マッピング)を定めた規格です。たとえば「A」は65、「B」は66といった具合に、各文字に固有の数値が割り当てられています。このマッピングが一通りであれば話は簡単ですが、言語の多様性や技術的制約、歴史的経緯などにより、さまざまな文字コード規格が策定・拡張されてきました。その結果、文字コードは非常に複雑になり、理解の障壁となっています。
近年ではUnicodeの普及により、文字コードを意識する機会は減ってきたように感じられますが、油断すると文字化けやバグとして問題が顕在化する、根の深いテーマです。
なぜ文字コードを学ぶべきか
プログラマが文字コードを学ぶべき理由は、「問題に遭遇したときに知らなければ戦えない」からです。
たとえば、いわゆる「0x5C問題(※1)」や、同一の文字に複数のコードポイントが存在する問題(※2)など、文字コードに起因するトラブルは少なくありません。こうした問題にどう対処すべきか、あるいはどのような問題が起こり得るのかを知っておくことは、実務上非常に重要です。すべてを理解する必要はありませんが、一度でも目を通しておくことで、問題に遭遇した際の手がかりになるはずです。
業務との関連性
ルータのファームウェア開発で文字コードが問題になるのかと思われる方もいるかもしれません。
今までに遭遇した事例を挙げると、設定ファイル(コンフィグ)に何らかの名前を定義する必要があり、英数字以外の文字に対応しなければならないケースがありました。ファームウェア開発といえども文字コードの扱いは避けて通れません。
もちろん、フロントエンドやアプリケーション開発と比べれば、文字コードが問題となる頻度は少ないかもしれませんが。
本書のおすすめポイント
本書の魅力は、文字コードを専門としない一般のエンジニアに向けて、必要な知識が体系的にまとめられている点です。文字コードの歴史的背景から始まり、代表的な符号化文字集合や文字符号化方式の解説、インターネットやプログラミング言語における文字コードの扱い、よくある問題とその対策まで、幅広いトピックが網羅されています。
また、純粋な技術書としてだけでなく、雑学的な面白さもあり、読み物としても楽しめる内容です。
まとめ
プログラムを書く以上、文字コードに関するトラブルは避けて通れません。その第一歩は、まず「相手を知る」ことです。プログラマに限らず、ITに関わるすべてのエンジニアに、本書を一度手に取っていただきたいと思います。
おまけ:豆知識
本書を読んで知った興味深い豆知識をひとつ。
北朝鮮の文字コード(KPS9566(※3))には、通常のチョソングル(ハングル)とは別に、最高指導者の名前を表すための特別な文字が定義されています。文字コードからも、お国柄が垣間見えるのは非常に興味深い点です。
注
- 0x5cはASCIIでは「バックスラッシュ」、Shift_JIS (JIS X 0201)では「円記号」と定義されているが、実用上では両者の区別が曖昧になっている。また、この文字はエスケープ文字やパス区切り文字として特別な意味を持つことが多く問題が生じやすい。[↑]
- たとえば、Unicodeで「é」(ラテン小文字 e にアキュート)は次の2通りの表現が可能だがコードポイントが異なるため検索でヒットしなかったり、意図せずフィルタをすり抜けたりする問題の要因となることがある。日本語でもカタカナと濁点の組み合わせ等で同様の問題が生じることがある。[↑]
-
U+0065
(e)+U+0301
(結合アキュート記号)U+00E9
(é)
-
- https://itscj.ipsj.or.jp/ir/202.pdf[↑]