第6章 データエンジニアリング基礎(データ加工・共有)
DS検定の文字コード(UTF-8・Shift_JIS)と文字化け
DS検定(リテラシーレベル)のデータエンジニアリング基礎には、変換元と変換先で文字コードが違うときに、変換の処理が書けるという項目があります。このページでは、「あ」「漢」「データ」がUTF-8とShift_JISで何バイトになるかを実測した値で、文字コードによって同じ文字でも並びが変わること、文字化けが起きる仕組み、CSVを書き出すときの選び方を確かめます。文字コードは、文字とバイトの対応表です。書いた側と読む側で表が違うと、文字化けします。
このページは試験の学習用の整理です。バイト数はPython 3で実測した値で、文字はすべて説明用の例です。
公式情報の確認
試験日、料金、申込条件、試験方式など変動する情報は、公式情報を最終確認してください。 当サイトの一次情報確認日: 2026-10-02。
試験の出題範囲・実施要項は変動するため、受験前に公式情報を確認してください。
結論
- 文字コードは、文字をバイトの並びに置き換える規則。規則が違えば、同じ文字でもバイトの並びが変わる
- UTF-8は1文字を1〜4バイトで表す。ひらがなや漢字は多くが3バイト
- Shift_JISでは、ひらがなや漢字は2バイト。英数字は両方とも1バイトで同じ値
- 文字化けは、書いた側と読む側の文字コードが違うときに起きる。直すには、書いたときの文字コードで読み直す
- CSVを渡すときは、相手の指定を最優先にする。指定がなければUTF-8にそろえる
同じ文字でも文字コードでバイト数が違う
5つの文字列を、UTF-8とShift_JISで書き出したときのバイト数と16進表記です。16進表記は、1バイトを2桁で書いたものです。
| 文字 | UTF-8 | Shift_JIS |
|---|---|---|
| A | 1バイト(41) | 1バイト(41) |
| あ | 3バイト(E3 81 82) | 2バイト(82 A0) |
| 漢 | 3バイト(E6 BC A2) | 2バイト(8A BF) |
| データ | 9バイト(E3 83 87 E3 83 BC E3 82 BF) | 6バイト(83 66 81 5B 83 5E) |
| 東京 | 6バイト(E6 9D B1 E4 BA AC) | 4バイト(93 8C 8B 9E) |
「A」は両方とも41で、英数字だけのファイルは、どちらの文字コードで読んでも同じ結果になります。「あ」は、UTF-8では3バイト、Shift_JISでは2バイトで、バイトの値も別物です。日本語を含むファイルでは、UTF-8の方が1文字あたりのバイト数が多く、同じ文章でファイルが大きくなります。たとえば「データ」は、UTF-8で9バイト、Shift_JISで6バイトです。
UTF-8が1〜4バイトを使うのは、RFC 3629が、U+0000からU+10FFFFまでの文字を1〜4オクテットの並びで符号化すると定めているためです。UTF-8は世界中の文字を同じ規則で表せるので、国をまたいで使うデータの受け渡しに向いています。
文字化けが起きる仕組み
「データ」をUTF-8で書き出すと、E3 83 87 E3 83 BC E3 82 BF の9バイトです。これを、Shift_JISだと思って読むと、バイトを2つずつ別の文字に当てはめてしまい、意味のない文字が並びます。Pythonで読み間違いを許す設定にして試すと、「繝�繝シ繧ソ」のような文字になりました。
逆に、Shift_JISで書いた「データ」の6バイト(83 66 81 5B 83 5E)を、UTF-8として読むと、UTF-8の規則に合わないバイトが含まれるため、厳密に読む設定ではエラーになります。読み間違いを許す設定では、読めない部分が「�」に置き換わります。文字化けの原因は、データが壊れていることではなく、読む側が別の対応表を使っていることです。元のバイトが残っていれば、正しい文字コードで読み直すと戻ります。
変換処理を書くときは、読み込みの段階で「変換元の文字コード」を指定し、書き出しの段階で「変換先の文字コード」を指定します。変換先で表せない文字は、エラーになったり、別の文字に置き換わったりします。たとえば「①」や「~」は、Pythonのshift_jisでは書き出せずエラーになり、拡張版のcp932では書き出せました。
CSVを書き出すときの選び方
公式の★1つ星には、加工・分析した結果をCSV、XML、JSON、Excelなどの指定された形式で書き出す項目もあります。CSVは文字だけのファイルなので、文字コードの指定が大切です。どれにするかは、渡す先で決まります。
| 渡す先 | 選ぶ文字コード | 確認すること |
|---|---|---|
| Webのシステムや他社と受け渡すデータ | UTF-8。世界中の文字を同じ規則で表せる | 受け取る側の指定がなければUTF-8にそろえるのが無難 |
| 古い業務システムが読む取り込み用ファイル | 相手が指定した文字コード(Shift_JISなど) | 仕様書の文字コードの欄を確認し、変換して書き出す |
| 人が表計算ソフトで開くCSV | 使うソフトが読める文字コード | 受け取る人のソフトで試し開きし、文字化けしないか確かめてから渡す |
BOMは、ファイルの先頭に置く目印です。RFC 3629は、UTF-8のBOMは常に EF BB BF のバイト列で現れると説明しています。読む側のソフトが何を想定しているかが分からないときは、文字コードの名前を、ファイルの名前や受け渡しの連絡に書き添えます。「商品名,価格」と「りんご,120」の2行のCSVは、改行を含めてUTF-8で31バイト、Shift_JISで23バイトでした。
DS検定の学習に使う書籍(Amazon)
試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。
よくある質問
DS検定で、文字コードはどこまで問われますか?
公式スキルチェックリスト(data_engineering.csv)の★1つ星は、変換元と変換先の文字コードが異なるときに変換処理のコードが書けることです。個々のコードの値を暗記するより、文字コードが違うと同じ文字でもバイトの並びが変わること、読む側が別の文字コードで解釈すると文字化けすることを説明できるかが中心になります。
UTF-8では、1文字は何バイトですか?
1文字は1〜4バイトです。RFC 3629は、U+0000〜U+10FFFFの範囲の文字を1〜4オクテット(1オクテットは8ビット=1バイト)の並びで符号化すると定めています。英数字は1バイト、ひらがなや漢字は多くが3バイトです。
BOMとは何ですか。付けるべきですか?
ファイルの先頭に置く目印です。UTF-8のBOMは、バイトの並びで EF BB BF になります。UTF-8は1バイトずつ読む形式なので、バイトの並べ方を知らせる役割は要りません。付けるかどうかは、受け取る側のソフトがBOMを想定しているかで決めるため、渡す前に相手の仕様を確かめます。
文字化けを直すには、どうしますか?
書いたときの文字コードを確かめ、読むときに同じ文字コードを指定し直します。原因はたいてい、書いた側と読んだ側で文字コードが違うことです。いったん文字化けした状態のファイルを上書き保存すると、元に戻せなくなることがあるため、元のファイルは残しておきます。
