📖
UTF-8、ASCII、文字エンコーディングに関連する質問一覧
今更ながら文字コードについて、子供に聞かれたので、まとめてみました。
この辺りは、コンピューターの歴史を感じるので、個人的には好きですが
文字
文字コードに関する技術的な理解を問う面接や試験で出されそうな質問を、基礎から応用まで幅広く考えました。それぞれの質問に対する回答もつけています。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, 記号) -
127
→ DEL(削除文字)
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}")
utf-8
と utf-8-sig
の違いは?
Q17: A:
-
utf-8
→ 通常のUTF-8(BOMなし) -
utf-8-sig
→ UTF-8 + BOM(0xEF 0xBB 0xBF
)
print("あ".encode("utf-8"))
の出力は?
Q18: A:
b'\xe3\x81\x82' # UTF-8での "あ"
Q19: どんな状況でエンコーディングエラーが起こるか?
A:
-
shift_jis
でutf-8
のデータを開く -
latin-1
でutf-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