技術(非IT系)

ユニコードとは?文字コードの仕組みをわかりやすく解説!(UTF-8:UTF-16:国際標準:多言語対応:エンコーディング)

当サイトでは記事内に広告を含みます

パソコンやスマートフォンで日本語・中国語・アラビア語・絵文字が同時に表示されるのは、「ユニコード(Unicode)」という仕組みがあるからです。

「ユニコードって何?UTF-8やUTF-16との違いは?」「なぜ文字化けが起きるの?」という疑問をお持ちの方に向けて、この記事ではユニコードの仕組みをわかりやすく解説します。

この記事では、ユニコードの基本概念・歴史・UTF-8とUTF-16の違い・日本語との関係・プログラミングでの活用方法まで、幅広く丁寧に解説します。

エンジニア・デザイナー・コンテンツ制作者から、IT初心者まで役立つ内容をまとめました。

ユニコードを正しく理解することで、文字化けトラブルの解決や多言語対応アプリの開発がぐっとスムーズになります。

ユニコードとは何か?基本概念と歴史を解説

それではまず、ユニコードの基本概念と誕生の歴史について解説していきます。

ユニコード(Unicode)とは、世界中のすべての文字を一つの統一された番号体系で表すための国際標準規格です。

ユニコードの基本

① 正式名称:Unicode(ユニコード)。国際標準規格 ISO/IEC 10646 とほぼ同等。

② 管理団体:Unicode Consortium(ユニコードコンソーシアム)。非営利組織。

③ 現在の収録文字数:Unicode 15.1(2023年)時点で約149,878文字以上。

④ 対応言語数:150以上の言語・文字体系と絵文字(emoji)に対応。

⑤ 各文字には「コードポイント(U+XXXX形式)」という一意の番号が割り振られる。

⑥ Unicode自体は番号体系であり、実際のデータ表現方式(エンコーディング)は別途定義される。

ユニコードが誕生する以前は、各国・各企業が独自の文字コードを使用していました。

日本ではShift_JIS・EUC-JP・JISコード、中国ではGB2312、韓国ではEUC-KRなど、言語ごとに異なる文字コードが乱立していました。

この状況では、異なる文字コードを使うシステム間でデータをやり取りすると文字化けが頻発し、国際的なデータ交換が非常に困難でした。

この問題を解決するために1987年にXerox・Appleが取り組みを開始し、1991年にUnicode 1.0が正式に公開されました。

ユニコードのコードポイントとは何か

ユニコードでは、すべての文字に「コードポイント(code point)」という固有の番号が割り振られています。

コードポイントは「U+」に続く16進数で表記されます。

ユニコードのコードポイント例

U+0041:大文字の「A」(ラテン文字)

U+3042:「あ」(ひらがな)

U+4E2D:「中」(CJK統合漢字)

U+1F600:😀(にこにこ顔の絵文字)

U+03B1:「α」(ギリシャ小文字アルファ)

U+0030:数字の「0」

U+03A9:「Ω」(ギリシャ大文字オメガ)

U+00A9:「©」(著作権記号)

コードポイントはU+0000からU+10FFFFまでの範囲(約110万個)が定義されており、そのうち現在約14万9千個が実際の文字に割り当てられています。

残りの大部分は将来の拡張のために予約されています。

ユニコードの文字ブロックと分類

ユニコードの文字空間は「文字ブロック(block)」と呼ばれるグループに分類されています。

主な文字ブロックには以下のものがあります。

コードポイント範囲 ブロック名 収録内容
U+0000〜U+007F 基本ラテン文字 ASCII文字(英数字・記号)
U+0080〜U+00FF ラテン拡張1 ©・®・°などの記号
U+0370〜U+03FF ギリシャ文字・コプト文字 α・β・Ω・πなど
U+3040〜U+309F 平仮名 あ〜ん・ぁ〜ん
U+30A0〜U+30FF 片仮名 ア〜ン・ァ〜ン
U+4E00〜U+9FFF CJK統合漢字 日中韓共通漢字約2万字
U+1F600〜U+1F64F 絵文字(顔文字) 😀😊😭などの顔文字
U+1F300〜U+1F5FF その他の絵文字記号 🌍🎉🚀などの記号

エンコーディングとは?UTF-8・UTF-16・UTF-32の違い

続いては、ユニコードのエンコーディング方式の違いについて確認していきます。

「ユニコード」と「UTF-8」は同じものだと思っている方も多いですが、実は別の概念です。

エンコーディングとユニコードの違い

ユニコードは「文字に番号を割り振るルール(コードポイント体系)」であり、エンコーディングは「そのコードポイントをコンピュータのバイトデータとして実際に表現する方式」です。

つまり、ユニコードのコードポイントU+3042(あ)という抽象的な番号を、実際のファイルやメモリにどのようなバイト列として格納するかを定めるのがエンコーディングです。

ユニコードのエンコーディング方式には主に「UTF-8」「UTF-16」「UTF-32」の3種類があります。

UTF-8の仕組みと特徴

UTF-8(Unicode Transformation Format-8)は現在最も広く使われているユニコードエンコーディング方式です。

UTF-8は可変長エンコーディングで、コードポイントの範囲によって1〜4バイトを使って文字を表現します。

UTF-8のバイト数と文字の範囲

1バイト:U+0000〜U+007F(ASCII文字:英数字・基本記号)

2バイト:U+0080〜U+07FF(ラテン拡張・アラビア文字・ヘブライ文字など)

3バイト:U+0800〜U+FFFF(日本語・中国語・韓国語を含む基本多言語面)

4バイト:U+10000〜U+10FFFF(補助文字・絵文字・歴史的文字など)

例:「A」(U+0041)→ 0x41(1バイト)

例:「あ」(U+3042)→ 0xE3 0x81 0x82(3バイト)

例:😀(U+1F600)→ 0xF0 0x9F 0x98 0x80(4バイト)

UTF-8の最大のメリットは「ASCII互換性」です。

ASCII文字(英数字・基本記号)はすべて1バイトで表現されるため、英語テキストではShift_JISやEUC-JPと比べてファイルサイズが小さく、既存のASCII対応システムとの互換性も高いです。

Webページ・メール・API・プログラムのソースコードなど、現代のデジタルコンテンツの標準エンコーディングとしてUTF-8が採用されています。

UTF-16とUTF-32の特徴と使いどころ

UTF-16は固定2バイトまたは可変4バイトでコードポイントを表現する方式です。

WindowsのNTFS・JavaのString型・JavaScriptの文字列・.NET Frameworkなど、多くのシステム内部でUTF-16が使用されています。

UTF-32はすべての文字を固定4バイトで表現します。

変換処理が簡単でランダムアクセスが容易なメリットがある一方、ファイルサイズが大きくなるデメリットがあります。

主に内部処理・データベースの特定カラムなどで使われることがあります。

エンコーディング バイト数 特徴 主な用途
UTF-8 1〜4バイト(可変長) ASCII互換・省サイズ Web・メール・ファイル全般
UTF-16 2または4バイト(可変長) Windows・Java内部標準 Windows OS・Java・JavaScript
UTF-32 4バイト(固定長) ランダムアクセス容易 内部処理・特定DB

日本語とユニコードの関係:CJK統合漢字と文字化け

続いては、日本語とユニコードの関係について確認していきます。

日本語はユニコードにおいて特別な扱いが必要な言語の一つです。

CJK統合漢字とは何か

ユニコードでは、日本語・中国語・韓国語で共通して使われる漢字を「CJK統合漢字(CJK Unified Ideographs)」として一つのコードポイントにまとめています。

たとえば「中(なか)」という漢字は、日本語・中国語(中文)・韓国語で異なる書き体を持つ場合がありますが、ユニコードでは基本的に同一のコードポイント(U+4E2D)が割り当てられています。

このCJK統合漢字の方針に対しては「漢字統合問題(Han Unification)」として議論があり、見た目が異なる字体(日本語の「漢」と中国語の「漢」)に同じコードポイントが付与されることへの批判もあります。

日本語のShift_JISからUTF-8への移行

日本ではWindowsの普及に伴いShift_JISが長く標準的な文字コードとして使われてきましたが、現在はUTF-8への移行が進んでいます。

Webサイトでは2010年代にほぼUTF-8が標準となり、現在ではShift_JISを使うWebサイトは少数になっています。

プログラミングの分野でも、Python 3・Ruby・Swift・Goなどのモダンな言語はデフォルトでUTF-8を採用しており、従来の文字コード問題が大幅に改善されています。

ただし、古い業務システム・CSVファイル・レガシーデータベースにはShift_JISが残っている場合も多く、UTF-8への変換時に文字化けが起きないよう注意が必要です。

BOM(バイトオーダーマーク)とは何か

UTF-8ファイルの先頭に付けられることがある「BOM(Byte Order Mark)」は、ファイルがUTF-8であることを示す特別なバイト列(0xEF 0xBB 0xBF)です。

「UTF-8 BOM付き」と「UTF-8 BOMなし」があり、WindowsのExcelでCSVを開く際にBOM付きUTF-8でないと文字化けするケースがあります。

一方、LinuxやMacのシステムではBOMなしUTF-8が標準であり、BOMが含まれていると問題を引き起こすこともあります。

CSVファイルをExcelと他のシステムの両方で使う場合は、BOM付きUTF-8での保存が文字化け対策として有効です。

プログラミングでのユニコード活用

続いては、プログラミングの場面でユニコードをどのように活用するかを確認していきます。

各言語でのユニコード対応の状況と、実践的な注意点を解説します。

Pythonでのユニコード処理

Python 3ではすべての文字列がデフォルトでユニコード(UTF-8)として扱われます。

PythonでのUnicode活用例

文字のコードポイントを取得:ord(‘あ’) → 12354(10進数)

コードポイントから文字を生成:chr(12354) → ‘あ’

Unicodeエスケープ:’\u3042′ → ‘あ’

ファイルのUTF-8読み込み:

with open(‘file.txt’, encoding=’utf-8′) as f:

text = f.read()

文字列の長さ(文字数):len(‘こんにちは’) → 5

JavaScriptでのUnicode処理

JavaScriptの文字列は内部でUTF-16エンコーディングを使用しています。

基本的な文字(U+FFFF以下)は1つのコード単位(16ビット)で表現されますが、絵文字などの補助文字(U+10000以上)はサロゲートペアと呼ばれる2つのコード単位で表現されます。

この仕様により、絵文字を含む文字列のlengthプロパティが意図した文字数と異なる場合があるため、文字列処理で注意が必要です。

HTMLとユニコード文字参照

HTMLではユニコードのコードポイントを使った「数値文字参照」で任意の文字を表示できます。

「あ」または「あ」と記述することで「あ」が表示されます。

これは文字コードの問題を回避しながら特殊文字を安全に表示するための方法として、HTMLコーディングで活用されています。

まとめ

この記事では、ユニコードの基本概念・歴史・コードポイントの仕組み・UTF-8とUTF-16の違い・日本語との関係・プログラミングでの活用方法まで幅広く解説しました。

ユニコードは「世界中のすべての文字に固有の番号を割り振る国際標準」であり、UTF-8はそのコードポイントをバイトデータとして実際に表現するエンコーディング方式です。

現代のWeb・アプリ・データ交換の標準はUTF-8であり、新規システム・ファイルはUTF-8を使うことが文字化けトラブル回避の最善策です。

BOMの有無・CJK統合漢字の問題・レガシーシステムとの互換性など、実務で注意すべき点も理解しておくと、多言語対応の開発がスムーズに進みます。

ユニコードへの理解を深めることで、グローバルなソフトウェア開発・多言語コンテンツ制作の品質が大きく向上するでしょう。