基本情報

文字コードとは?ASCII・Shift_JIS・UTF-8の違いと文字化け基本情報

更新 ・書いた人 合格ナビ 編集長(運営者)

この記事でわかること

文字コードとは、文字をコンピュータの内部で数値(バイト列)に対応づける約束事です。ASCII・JISコード・Shift_JIS・EUC・UnicodeのUTF-8の違い、UTF-8のビットの割り当て方、文字化けが起きる仕組みを、自作の計算例と一次資料で整理。IPAの公開問題(科目A・科目B)の解き方も載せています。

目次
  1. 文字コードとは:文字を数値(バイト列)に対応づける約束事
  2. 主な文字コードの違い:ASCII・JIS・Shift_JIS・EUC・Unicode
  3. UTF-8の仕組み:符号位置を1〜4バイトに割り当てる
  4. 文字化けはなぜ起きるか:書いた方式と読む方式がずれる
  5. 文字数とバイト数:同じ文字列でも方式でバイト数が変わる
  6. 公開問題を解く①:科目A 令和6年度 問2(ASCIIコードの連続性)
  7. 公開問題を解く②:科目B サンプル問題 問16(UTF-8への変換)
  8. 文字コードの問題で間違えやすい点
  9. まとめ
結論:文字コードとは、文字をコンピュータの内部で数値(バイト列)に対応づける約束事です。同じ文字でも、約束事が違えばバイト列が変わるので、書いた側と読む側で約束事が食い違うと「文字化け」になります。代表的なものは、英数字7ビットのASCII、日本語用のJISコード・Shift_JIS・EUC(日本語用はEUC-JP)、世界の文字をまとめたUnicode(符号化方式はUTF-8など)です。基本情報技術者試験のシラバスはこれらを用語例に挙げ、公開問題では科目A 令和6年度 問2(ASCIIコードの連続性)と科目B サンプル問題 問16(UTF-8への変換)が、文字コードそのものを主題にしていました。

当サイトに収録している基本情報技術者試験の公開問題520問と、IPAの科目A・科目Bの公開PDF(サンプル問題と令和5〜8年度)、ITパスポート試験の600問の文章を、文字コード・Unicode・UTF-8・ASCII・Shift_JISの語で検索しました(2026-10-21 時点)。文字コードそのものが主題の問題は、科目A 令和6年度 問2 と科目B サンプル問題 問16 の2問でした。ITパスポート試験の収録600問には、文字コードを主題とする問題の収録がありません。午前試験(平成21年度〜令和元年度)の問題冊子は画像のため、午前は当サイトの収録分に限った集計です。数は語を含む問題の数で、出題の多さを示すものではありません。

文字コードとは:文字を数値(バイト列)に対応づける約束事

コンピュータの内部では、文字も数値で保存されます。どの文字にどの数値を割り当てるか、その数値を何バイトの並びで保存するかを決めたものが文字コードです。ITパスポート試験のシラバス Ver.6.5 は、「コンピュータの内部では,文字を数値で表現していること」「代表的な文字コードの特徴」を挙げ、用語例に「JIS コード,シフトJIS コード,Unicode」を示しています(大分類7 中分類13「基礎理論」の35.情報に関する理論 (3) 文字の表現)。

基本情報技術者試験のシラバス Ver.9.2 は、同じ項目で「代表的な文字コードを理解する。」と書き、用語例に「ASCII コード,EUC,JIS コード,シフトJIS コード,Unicode,UCS」を挙げています(大分類1 中分類1 基礎理論の3. 情報に関する理論 (3) 文字の表現)。

シラバスの版:基本情報技術者試験は Ver.9.2、ITパスポート試験は Ver.6.5。最終確認日:2026-10-21。出典:IPA 試験要綱・シラバスについて。

IPAのシラバス Ver.9.2 には、UTF-8 の記載がありません(2026-10-21 時点)。ただし、科目Bのサンプル問題に UTF-8 を扱う問題があるため、Unicodeの符号化方式の一つとして仕組みを知っておく意味はあります。用語は用語集の「文字コード」と「Unicode」にもあります。

主な文字コードの違い:ASCII・JIS・Shift_JIS・EUC・Unicode

「あ」と「漢」を例に、各方式のバイト列を並べます。値は当サイトの計算です(Pythonの標準の符号化で全て出力。UTF-16はビッグエンディアン・BOMなしで、リトルエンディアンだと「あ」は 42 30 になります。Shift_JISにはPythonのcp932を使用しています。半角カナ ア(B1)は、WebのShift_JISの定義であるWHATWG Encoding Standardのデコーダ(0xA1〜0xDF が U+FF61〜に対応)でも同じです)。

文字UTF-8UTF-16Shift_JISEUC-JPISO-2022-JP(JISコードの一種)
A(U+0041)4100 41414141
あ(U+3042)E3 81 8230 4282 A0A4 A21B 24 42 24 22 1B 28 42
漢(U+6F22)E6 BC A26F 228A BFB4 C11B 24 42 34 41 1B 28 42
ア(半角カナ・U+FF71)EF BD B1FF 71B18E B1表せない
  • ASCII:7ビットの符号(RFC 20)。英数字と記号を表します。表の A の行は、UTF-16(00 41)以外はどれも 41 で、ASCIIの範囲の文字は多くの方式で同じバイト列になります
  • JISコード:シラバスの用語例の名前です。ここでは代表例として、電子メール向けに定義された ISO-2022-JP(RFC 1468)を載せました(当サイトの整理)。7ビットだけで日本語を表すため、漢字の前に切り替えの目印 1B 24 42(ESC $ B)、ASCIIに戻すときに 1B 28 42(ESC ( B)を置き、漢字は1文字2バイトです
  • Shift_JIS:ASCIIの範囲は1バイト、半角カナ(A1〜DF)も1バイト、漢字・ひらがななどは2バイトです。WHATWG Encoding Standard のデコーダの定義では、2バイト目に 0x40〜0x7E の範囲が含まれ、記号の \ にあたる 0x5C も2バイト目に入ります(「表」は 95 5C、「能」は 94 5C)
  • EUC-JP:ASCIIは1バイト、漢字などは A1〜FE の2バイトの組です。半角カナは 8E の後に1バイトを付けて2バイトで表します(WHATWG Encoding Standard)
  • Unicode:世界の文字に符号位置(U+0041 のような番号)を与える規格です。符号位置は 0 から 10FFFF(16進数)の範囲で、UTF-8 は1〜4バイト、UTF-16 は16ビットを1〜2個、UTF-32 は32ビット1個で表します(Unicode Consortium FAQ)

出典:RFC 20・RFC 1468・RFC 3629・WHATWG Encoding Standard・Unicode FAQ(UTF-8, UTF-16, UTF-32 & BOM)。

「UCS」(Universal Character Set)はISO/IEC 10646が定める文字集合の名前です(RFC 3629)。UnicodeとISO/IEC 10646は同じ文字を同じ番号で扱うよう、内容が合わせて作られています(Unicode Consortium FAQ「Unicode and ISO」)。

UTF-8の仕組み:符号位置を1〜4バイトに割り当てる

UTF-8は、符号位置の大きさで使うバイト数を変え、各バイトの先頭ビットで「何バイト目か」を示します(RFC 3629)。

符号位置(16進数)バイト数ビットのパターン(x に符号位置の2進数を右詰めで入れる)
0000〜007F10xxxxxxx
0080〜07FF2110xxxxx 10xxxxxx
0800〜FFFF31110xxxx 10xxxxxx 10xxxxxx
10000〜10FFFF411110xxx 10xxxxxx 10xxxxxx 10xxxxxx

出典:RFC 3629 の符号化の表。なお、サロゲート(D800〜DFFF)の符号位置はUTF-8で符号化しないと、同じRFCが定めています。

自作の例で「漢」(U+6F22)を符号化します。

  • ① 符号位置 6F22 を2進数にする:0110 1111 0010 0010(16桁)
  • ② 0800〜FFFF の範囲なので3バイト。ビットを「4 + 6 + 6」に分ける:0110 / 111100 / 100010
  • ③ パターンに入れる:11100110 10111100 10100010
  • ④ 16進数にする:E6 BC A2

検算:Pythonで「漢」をUTF-8に符号化すると E6 BC A2 で一致しました。逆向きに、E6 BC A2 の x の部分(0110・111100・100010)をつなぐと 0110111100100010=6F22 に戻ります。

UTF-8の特徴は次のとおりです。

  • ASCIIの範囲(0000〜007F)は1バイトで、ASCIIと同じバイト列になる(RFC 3629)
  • 各バイトの先頭ビットで、そのバイトが先頭か途中かが見分けられる(10 で始まるバイトは2バイト目以降)
  • 日本語のひらがな・漢字の多くは3バイト。「😀」(U+1F600)は4バイト(F0 9F 98 80)

文字化けはなぜ起きるか:書いた方式と読む方式がずれる

文字化けは、ファイルや通信の文字列を、書いたときと別の文字コードで読むと起きます。自作の例(Pythonで符号化して確認)です。

  • 「文字コード」をUTF-8で保存すると、15バイト(E6 96 87 E5 AD 97 E3 82 B3 E3 83 BC E3 83 89)になります。これをShift_JIS(cp932)として読むと、「譁�蟄励さ繝シ繝�」のような意味の通らない文字列になります。バイト列の区切り方が合わないためで、読み取れないバイトは「�」などに置き換わります(表示は環境で変わります)
  • 逆に、Shift_JISで保存した「文字コード」(95 B6 8E 9A 83 52 81 5B 83 68)をUTF-8として読むと、多くのバイトが読み取れず「�」だらけになります
  • ASCIIだけの文章(例:ABC)は、UTF-8とShift_JISのどちらで読んでも同じ「ABC」になるので、化けません

つまり、文字化けは「データが壊れた」のではなく、「約束事の取り違え」です。バイト列が残っていれば、正しい文字コードで読み直すと戻ることがあります(当サイトの説明)。

文字数とバイト数:同じ文字列でも方式でバイト数が変わる

「バイト数を求める」問題を解くときの基本です。自作の例(Pythonで計算)をまとめます。

文字列文字数UTF-8UTF-16Shift_JIS
ABC33バイト6バイト3バイト
ABCあいう612バイト12バイト9バイト
文字コード515バイト10バイト10バイト

「文字コード」は、漢字2字、カタカナ・長音記号の3字の5文字です。UTF-8は全て3バイトなので 5×3=15、Shift_JISは全て2バイトなので 5×2=10です。英数字が混じるときは、英数字の分だけ別に数えます(ABCあいう のUTF-8は 3×1 + 3×3 = 12)。

公開問題を解く①:科目A 令和6年度 問2(ASCIIコードの連続性)

問題は、小文字1文字(a〜z)のキーを、大きさ10のハッシュ表に格納し、ハッシュ関数に「ASCIIコードを10進表記したときの1の位の数」を使うとき、衝突が起こるキーの組合せを選ぶものです。「ASCIIコードでは,昇順に連続した2進数が,アルファベット順にコードとして割り当てられている」という説明が付いています(令和6年度 科目A 問2。IPA 問題PDF・解答例PDF)。選択肢はアからエで、IPAの解答例の正解はエ(d と x)です。

解き方の筋道です。コードが連続しているので、文字どうしの「アルファベット順の差」が、そのままコードの差になります。1の位が同じになるのは、コードの差が10の倍数のときだけです。

  • a と i の差:8
  • b と r の差:16
  • c と l の差:9
  • d と x の差:20(10の倍数)→ 衝突する

実際のASCIIコード(d=100、x=120)で1の位を求めても、どちらも0で一致します。当サイトの確認として、a=97 から始まる実際の値、および開始値を0〜99に変えた場合の全てで、衝突するのは d と x だけでした(Pythonで全組を計算)。コードの値を覚えていなくても、「連続している」ことだけで解けます。

自作の練習です。同じ条件で、g と q は衝突するでしょうか。差は10なので衝突します(実際のコードは g=103、q=113 で、1の位はどちらも3)。

公開問題を解く②:科目B サンプル問題 問16(UTF-8への変換)

科目Bのサンプル問題 問16は、Unicodeの符号位置をUTF-8の符号に変換する擬似言語のプログラムを読む問題です(IPA 問題PDF・解答例PDF)。問題文は、符号位置が800(16進数)以上FFFF以下の文字を、3バイトのパターン 1110xxxx 10xxxxxx 10xxxxxx に符号化すると説明し、「あ」の例(3042 → 11100011 10000001 10000010)を示しています。プログラムは、符号位置を何かで割った余りを各バイトに足し、商で次のバイトに進む繰り返しです。空欄に入る数について、IPAの解答例の正解はク(64)です。

なぜ64か。上の「漢」の例で見たとおり、2バイト目・3バイト目には符号位置の6ビットずつが入ります。6ビットで表せる値の数は 2の6乗=64なので、64で割った余りが下位6ビット、商が残りのビットになります。

当サイトの確認として、問題文の擬似言語を同じ手順でPythonで再現し、800〜FFFF(サロゲートを除く61,440個の符号位置)の全てで試しました。除数を64にすると、UTF-8の正しい符号と全て一致し(不一致0個)、2・6・16・256ではどれも61,440個すべてが不一致でした。3042 を入れた追跡は次のとおりです。

  • 3バイト目:12354(3042)÷64の余り2 → 128+2=130、商193
  • 2バイト目:193÷64の余り1 → 128+1=129、商3
  • 1バイト目:224+3=227
  • 結果:227・129・130=E3 81 82(問題文の例と同じ)

文字コードの問題で間違えやすい点

  • 文字数とバイト数を混同する:UTF-8の日本語は多くが3バイトです。2バイトと決めつけず、方式を確認します
  • UnicodeとUTF-8を同じものとする:Unicodeは符号位置を決める規格、UTF-8はそれをバイト列にする方式の一つです
  • 2バイト目にASCIIと同じ値が来ることを忘れる:「表」(95 5C)のように、2バイト目に記号の \ と同じ 0x5C が現れる文字があり、1バイトずつASCIIとして読むと誤ります(上の Shift_JIS の説明、「表」「能」)
  • ASCIIのコード値の暗記に頼る:科目A 令和6年度 問2 は、連続している性質だけで解けました

まとめ

  • 文字コードは、文字を数値(バイト列)に対応づける約束事。書いた方式と読む方式がずれると文字化けになる
  • シラバスの用語例は、基本情報がASCII・EUC・JIS・シフトJIS・Unicode・UCS、ITパスポートがJIS・シフトJIS・Unicode
  • UTF-8は符号位置に応じて1〜4バイト。ASCIIの範囲は1バイトで同じバイト列。「漢」は E6 BC A2
  • 公開問題は、科目A 令和6年度 問2(コードの連続性で d と x が衝突)と、科目B サンプル問題 問16(6ビットずつ取り出すので64)の2問が主題
  • 関連:2進数と補数・論理回路も、基礎理論の範囲です

よくある質問

Q文字コードとUnicodeは同じものですか?

同じではありません。文字コードは「文字を数値に対応づける約束事」の総称で、ASCII・Shift_JIS・EUC・Unicodeなどがあります。Unicodeは世界の文字に番号(符号位置)を与える規格で、その番号を実際のバイト列にする方式がUTF-8・UTF-16・UTF-32です(Unicode Consortium の FAQ「UTF-8, UTF-16, UTF-32 & BOM」)。つまり「UTF-8」は文字コードの一つであり、Unicodeの符号化方式の一つです。

QASCIIは何ビットの文字コードですか?

ASCIIは7ビット(0〜127)の符号です(RFC 20)。パソコンでは1文字を1バイト(8ビット)で扱うので、実際には先頭のビットが0のバイトとして保存されます。UTF-8は、ASCIIの範囲の文字を同じ1バイトで表すように作られているため、英数字だけの文章はASCIIとUTF-8でバイト列が同じになります(RFC 3629)。

Q日本語の文字は、どの文字コードでも2バイトですか?

そうとは限りません。たとえば「あ」は、Shift_JISでは2バイト(82 A0)、UTF-8では3バイト(E3 81 82)、UTF-16では2バイト(30 42)です(当サイトの計算、Pythonで符号化して確認)。半角カナは、Shift_JISなら1バイトです。文字数とバイト数は一致しないので、「何バイトか」を問われたら、文字コードの種類と文字の種類を先に確かめます。

Q試験のために、文字コードの値を暗記する必要はありますか?

IPAのシラバスは、文字コードについて「代表的な文字コードを理解する」ことを求めており、暗記する値の一覧は示していません。当サイトで調べた範囲の公開問題(科目A 令和6年度 問2、科目B サンプル問題 問16)も、必要な符号の割り当て方は問題文に書いてあり、読み取って計算する形でした。暗記より、「ASCIIは連続した順に割り当てられる」「UTF-8は文字によって1〜4バイト」といった仕組みの理解を優先します(当サイトの提案)。

この資格の問題を解く基本情報技術者(FE) 科目A過去問問題集(全520問)
解いてみる

法令や試験の数字は、改正や年度で変わります。この記事の最終確認日は2026年10月21日です。申込みや合格基準は、必ず試験団体の公式情報で確かめてください。

合格ナビ 編集長・運営者

基本情報技術者(FE)の出題範囲・法令・公式の統計を参照して書いています。プロフィール・編集方針