Zenn
📖

UTF-8、ASCII、文字エンコーディングに関連する質問一覧

2025/03/13に公開

今更ながら文字コードについて、子供に聞かれたので、まとめてみました。

この辺りは、コンピューターの歴史を感じるので、個人的には好きですが

文字コードに関する技術的な理解を問う面接や試験で出されそうな質問を、基礎から応用まで幅広く考えました。それぞれの質問に対する回答もつけています。
文字

1. 基礎的な質問

Q1: ASCIIとは何ですか?

A:
ASCII(American Standard Code for Information Interchange)は、7ビット(128種類の文字) で英数字や基本記号を表す文字コード。英語圏の文字のみを扱う。

Q2: ASCIIの範囲は?

A:

  • 0-31制御文字(改行、タブなど)
  • 32-126印刷可能な文字(A-Z, a-z, 0-9, 記号)
  • 127DEL(削除文字)

Q3: ASCIIはなぜ7ビットなのですか?

A:
初期のコンピュータでは 1バイト(8ビット) ではなく 7ビットのメモリ単位が一般的 だったため。8ビット目はエラー検出用として使われることが多かった。

Q4: Unicodeとは何ですか?

A:
Unicodeは、世界中のすべての文字を一意に識別するための 文字セット(Character Set)。ASCII などの既存の文字コードの限界を克服するために開発された。

Q5: UnicodeとUTF-8の違いは?

A:

  • Unicode → 文字の一覧(文字セット) を定義
  • UTF-8 → Unicode の文字をエンコード(符号化) する方法のひとつ(可変長 1〜4バイト)

Q6: UTF-8の仕組みは?

A:
UTF-8は 可変長エンコーディング で、文字によってバイト数が異なる:

  • 1バイト → ASCII互換 (A = 0x41)
  • 2バイト → ラテン系 (é = 0xC3 0xA9)
  • 3バイト → 日本語 (あ = 0xE3 0x81 0x82)
  • 4バイト → 絵文字 (🚀 = 0xF0 0x9F 0x9A 0x80)

Q7: UTF-8とASCIIの関係は?

A:
UTF-8の最初の128文字(0x00 - 0x7F)はASCIIと完全に一致。つまり、ASCIIの文字列はUTF-8としてもそのまま有効。


2. 応用的な質問

Q8: UTF-8には何バイトの文字が含まれますか?

A:
UTF-8の文字は 1〜4バイト で表現される。

  • 1バイト → ASCII(0xxxxxxx
  • 2バイト → ラテン系文字など(110xxxxx 10xxxxxx
  • 3バイト → 日本語、中国語、韓国語(1110xxxx 10xxxxxx 10xxxxxx
  • 4バイト → 絵文字、特殊記号(11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Q9: UTF-16とUTF-8の違いは?

A:

  • UTF-8可変長(1〜4バイト)。ASCII互換でメモリ効率が良いが、非ASCII文字が多いとデータサイズが増える。
  • UTF-16固定長(2または4バイト)。非ASCII文字が多い場合は効率的だが、ASCII互換性がない。

Q10: UTF-8とUTF-32の違いは?

A:

  • UTF-8 → 可変長(1〜4バイト)
  • UTF-32 → 固定長(常に4バイト)。文字のアクセスは速いが、メモリ消費が多い。

Q11: BOM(Byte Order Mark)とは何ですか?

A:
BOM(Byte Order Mark)は、テキストファイルのエンコーディングを識別するためのバイト列。UTF-8 では 0xEF 0xBB 0xBF だが、通常は不要。

Q12: Shift_JISとUTF-8の違いは?

A:

  • Shift_JIS → 日本語専用。可変長(1または2バイト)。互換性が低く、他言語を扱えない。
  • UTF-8 → 国際標準。可変長(1〜4バイト)。多言語対応。

3. コーディング問題

Q13: "Hello" を ASCIIコード(10進数)に変換せよ

A:

s = "Hello"
ascii_values = [ord(c) for c in s]
print(ascii_values)  # [72, 101, 108, 108, 111]

Q14: UTF-8のバイト列をデコードする方法

A:

utf8_bytes = b'\xe3\x81\x82'  # "あ" のUTF-8バイト列
decoded_str = utf8_bytes.decode('utf-8')
print(decoded_str)  # あ

Q15: 文字列をUTF-8でエンコードする方法

A:

s = "こんにちは"
utf8_bytes = s.encode('utf-8')
print(utf8_bytes)  # b'\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf'

4. 実践的な質問

Q16: Pythonでファイルのエンコーディングを自動判定する方法

A:

import chardet

with open("test.txt", "rb") as f:
    raw_data = f.read()
    encoding = chardet.detect(raw_data)["encoding"]

print(f"ファイルのエンコーディング: {encoding}")

Q17: utf-8utf-8-sig の違いは?

A:

  • utf-8 → 通常のUTF-8(BOMなし)
  • utf-8-sig → UTF-8 + BOM(0xEF 0xBB 0xBF

Q18: print("あ".encode("utf-8")) の出力は?

A:

b'\xe3\x81\x82'  # UTF-8での "あ"

Q19: どんな状況でエンコーディングエラーが起こるか?

A:

  • shift_jisutf-8 のデータを開く
  • latin-1utf-8 の特殊文字を読む

解決策:

with open("file.txt", encoding="utf-8", errors="ignore") as f:
    text = f.read()

まとめ

このリストをマスターすれば、文字コードに関する面接や試験は完璧に対応できます!

  • 基礎知識(ASCII, Unicode, UTF-8の仕組み)
  • エンコーディングの違い(UTF-8 vs UTF-16 vs UTF-32)
  • プログラム実装(エンコーディングの変換、エンコード・デコード)
  • 実践的な知識(ファイル処理、BOM、エンコーディングエラー)

この知識があれば、システム開発やデータ処理のトラブルシューティングでも役立つでしょう! 🚀

Discussion

ログインするとコメントできます