個人ブログのようなものです。とくにジャンルはありません。
記事の概要
作成日:2020-08-16
最終更新日:2020-08-16
1ヵ月あたりのビュー数:22
記事の文字数:2186
文字コードについて
文字コード概要

文字コードに対する基本的なところを勉強中。

基本的な文字コード(文字符号化方式)の一覧は以下の通り。
「文字符号化方式」と「符号化文字集合」の違いは後述。

文字コード名
(文字符号化方式)
符号化文字集合ビット数「a」表現「あ」表現備考
ASCIIASCII8ビット0x61(表現不可)基本となる文字コード。8ビットの内最後の1ビットはパリティビット
JISJIS X 0201
JIS X 0208
JIS X 0211
8ビット
16ビット
24ビット
0x610x2422正式名称は「ISO-2022-JP」
ASCIIコードをベースに日本語を扱えるようにした文字コード
しかし仕様上、ASCII文字と日本語文字が混在するとデータ量が増えるという問題を抱えている
SHIFT-JISJIS X 0201
JIS X 0208
8ビット
16ビット
0x610x82a0JISコードの問題点を解消した文字コード
JISと比較し一部使えない漢字がある
EUC-JPASCII
JIS X 0201
JIS X 0208
8ビット
16ビット
0x610xa4a2UNIX上で日本語を扱えるようにした文字コード
UTF-8Unicode8ビット~0x610xE38182現在の世界的な主流
ASCIIをそのまま置き換えることができる
可変長のビット長で例えば日本語の文字は3~4バイトで表されたりする
UTF-16Unicode16ビット~0x00610x3042UTF-8と同じ符号化文字集合「Unicode」を使う文字符号化方式
サイズの基本単位が16ビット(2バイト)で、「a」なども2バイトで表される。

符号化文字集合と文字符号化方式

文字コードと一言でいうが、実際にはざっくり2つのプロセスを踏まえて文字をビットに置き換えている。

1つ目は、例えば「あ」という文字を「1」という数字に置き換える作業。どの文字をどの数値に置き換えるかの対応表を「符号化文字集合」という。
この符号化文字集合でカバーできない文字がある場合、その文字はその文字コードにおいて使用できないということになる。

2つ目のプロセスは、「1」という数字を実際のビット列に置き換える作業。この時どのようにビット列に置き換えるかの方式を「文字符号化方式」という。
「UTF-8」や「UTF-16」は符号化文字集合こそ同じ「Unicode」を使っているが、符号化方式が異なるため最終的なビット列は異なるものになる。

この「文字符号化方式」を文字コードと呼ぶ(厳密には文字コードという言葉をその2つに紐づけることはできないらしいが、そう考えた方が分かりやすい)

実例

ここで「UTF-8」と「UTF-16」でひらがなの「あ」を符号化する。

【UTF-8の場合】
1.「あ」を「Unicode」に従い、「0x3042」に変換する
 (あ ⇒ 0x3042)

2.「0x3042」を2進数に置き換える
 (0x3042 ⇒ 0011000001000010)

3.下位ビットから6ビットずつセパレートする
 (0011000001000010 ⇒ 0011 000001 000010)

4.各ビット列の頭に「10」を付ける
 (0011 000001 000010 ⇒ 100011 10000001 10000010)

5.先頭のビット列が8桁になるように、頭に「1」埋めをする
 (100011 10000001 10000010 ⇒ 11100011 10000001 10000010)

6.16進数に戻す
 (100011 10000001 10000010 ⇒ 0xE3 0x81 0x82 ⇒ 0xE38182)

【UTF-16の場合】
1.「あ」を「Unicode」に従い、「0x3042」に変換する
 (あ ⇒ 0x3042)

2.2バイト文字はそのまま符号化する
 (0x3042 ⇒ 0x3042)
 (【リトルエンディアンの場合】0x3042 ⇒ 0x4230)

ビッグエンディアンとリトルエンディアン

「UTF」系列の文字コードでは、同じ文字コードでも「ビッグエンディアン」「リトルエンディアン」という区別を持つ。
違うのはビット列(バイト)の並び順。

例えばUTF-16だと「あ」は「0x3042」と表されるが、これを後ろのバイトから並べ直す、つまり「30」と「42」をひっくり返すと「0x4230」というビット列になる。
このひっくり返したものが「リトルエンディアン」で、ひっくり返す前のものが「ビッグエンディアン」になる。

2つをデータ上で区別する方法だが、テキストデータの先頭に特定のビット列を付与することで行う。もしくは文字コードで元からどちらを使用するかを区別するようにもできる。

このテキストデータの先頭に付与したビット列を「BOM」(Byte Order Mark)と言う。

文字コードエンディアンBOMの有無BOM
UTF-8ビッグ省略可能0xEFBBBF
UTF-8Nビッグ無し
UTF-16ビッグ省略可能0xFEFF
UTF-16リトル省略可能(非推奨)0xFFFE
UTF-16BEビッグ無し
UTF-16LEリトル無し
UTF-32ビッグ省略可能0x0000FEFF
UTF-32リトル省略可能(非推奨)0xFFFE0000
UTF-32BEビッグ無し
UTF-32LEリトル無し

関連ページ
SCSSとやらでメディアクエリと疑似要素の組み合わせに小一時間苦戦したという話
SCSSとやらでメディアクエリと疑似要素の組み合わせに小一時間苦戦したという話 当然ですが本サイト…
Twitterの「興味関心」のチェックを全部まとめて外す
Twitterの「興味関心」のチェックを全部まとめて外せない Twitterに「興味関心」とやらを…
ボタンを押す演出でCSSのtranslateYやtopを使用することの問題
ボタンを押す演出でCSSのtranslateYやtopを使用することの問題…
東京03のyoutubeチャンネルの概要ページの挙動がおかしい
東京03のyoutubeチャンネルの概要ページの挙動がおかしい…
Youtube Data APIでハンドルIDからユーザ情報を取得できない
Youtube Data APIでハンドルIDからユーザ情報を取得できない問題 結論から言うと現在…
ウマ娘まとめサイト(InoReader)
ウマ娘まとめサイト(InoReader)…
ウマ娘まとめサイト(Feedly)
ウマ娘まとめサイト(Feedly)…
Pythonを使ってinoreaderでサイトの更新情報を取得してみた
inoreader(イノリーダー?)が公開しているWeb APIを使用して、Pythonで自動的にサ…
Pythonを使ってFeedlyでサイトの更新情報を取得してみた
Pythonを使ってFeedlyでサイトの更新情報を取得してみた…
CPU-マルチプロセッサによる並列処理
CPU-マルチプロセッサによる並列処理…
CPUの高速化方式
CPUの高速化方式…
CPUの性能指標
CPUの性能指標…
CPU-アドレス指定方式
CPU-アドレス指定方式…
CPU命令実行の流れ
CPU命令実行の流れ…
(現在ページ)文字コードについて
文字コードについて…
base64エンコードの流れ(C#)
base64エンコードの流れ(C#)…
サイバー攻撃:非標的型攻撃とは
サイバー攻撃:非標的型攻撃とは…
サイバー攻撃:標的型攻撃とは
サイバー攻撃:標的型攻撃とは…
IPアドレスについて
IPアドレスについて…
シングルサインオン/SAML認証について
シングルサインオン/SAML認証について…
関連タグ
情報技術
コメントログ
コメント投稿




本サイトのタグ一覧
タグを表示する Webサイト作成Webツールアークナイツアークナイツ-ステージ攻略日記アズールレーンアズールレーン-日記ウマ娘ゲームデビラビローグホラーポケットタウン気ままな日記情報技術情報技術-WebAPI知的財産権統合戦略白夜極光本サイトについて魔王スライム様がんばる!漫画