カテゴリ: C# 更新日: 2026/03/16

C#のJSON・XML操作を完全解説!文字化けを防ぐエンコーディング指定の基本

C#のJSON・XML操作でエンコーディングを指定する方法
C#のJSON・XML操作でエンコーディングを指定する方法

先生と生徒の会話形式で理解しよう

生徒

「C#を使って、データを保存するファイルを作りたいのですが、日本語が変な記号になってしまいます。どうすればいいですか?」

先生

「それはエンコーディング、つまり文字の背番号の割り当て方がズレているのが原因ですね。JSONやXMLを扱うときは、保存や読み込みの時に正しい形式を指定する必要があります。」

生徒

「エンコーディングって難しそうですね。初心者でもコードで指定できますか?」

先生

「大丈夫ですよ!やり方さえ覚えれば、たった一行追加するだけで解決します。それでは、具体的な方法を一緒に見ていきましょう!」

1. エンコーディングとは何かを理解しよう

1. エンコーディングとは何かを理解しよう
1. エンコーディングとは何かを理解しよう

プログラミングの世界では、コンピュータは数字しか理解できません。私たちが普段使っている「あ」や「A」といった文字をコンピュータに伝えるためには、それぞれの文字に特定の数字を割り当てる必要があります。この「文字と数字の対応表」のことをエンコーディング(文字符号化方式)と呼びます。

例えば、ある対応表では「あ」が1番でも、別の対応表では「あ」が100番になっていることがあります。これを知らずに、1番の表で作ったデータを100番の表で読み込もうとすると、全く違う文字が表示されてしまいます。これが、初心者が最初につまずきやすい文字化けの正体です。

C#でよく使われるのはUTF-8という世界標準の形式です。これを使えば、日本語も英語も、さらには絵文字なども正しく扱うことができます。特にJSONやXMLといったデータをやり取りする形式では、このUTF-8を指定することが一般的です。

2. JSON操作でエンコーディングを指定する基礎知識

2. JSON操作でエンコーディングを指定する基礎知識
2. JSON操作でエンコーディングを指定する基礎知識

JSON(ジェイソン)は、データを保存したりインターネットで送ったりする際によく使われる、とてもシンプルで便利な書き方です。C#でJSONを扱うときは、System.Text.Jsonという名前の機能を使うのが現代の主流です。

通常、C#のJSON機能は自動的にUTF-8という形式でデータを処理しようとします。しかし、ファイルに書き出すときや、特定の古いシステムに合わせて「Shift-JIS(シフトジス)」という日本独自の古い形式を使いたい場合には、明示的にエンコーディングを指定する必要があります。

ここで重要なキーワードはEncodingクラスです。これはSystem.Textというグループの中に用意されており、これを使うことで「この文字形式で保存してね」という命令をプログラムに出すことができます。

3. JSONファイル保存時にUTF-8を指定して書き込む方法

3. JSONファイル保存時にUTF-8を指定して書き込む方法
3. JSONファイル保存時にUTF-8を指定して書き込む方法

まずは、最も基本的な「JSON形式のデータをファイルに保存する」コードを見てみましょう。ここでは、明示的にUTF-8という文字形式を指定して、日本語が含まれていても壊れないように保存します。

シリアライズという言葉が出てきますが、これは「プログラム上のデータ(オブジェクト)を、保存可能なテキスト形式に変換すること」だと考えてください。


using System;
using System.IO;
using System.Text;
using System.Text.Json;

// 保存したいデータを作成
var user = new { Name = "田中太郎", Age = 25 };

// JSON形式の文字列に変換
string jsonString = JsonSerializer.Serialize(user);

// ファイルに書き込む(UTF-8エンコーディングを指定)
File.WriteAllText("user.json", jsonString, Encoding.UTF8);

Console.WriteLine("ファイルを保存しました。");

実行結果は以下のようになります。


ファイルを保存しました。

このコードでは、File.WriteAllTextという機能の3番目の材料としてEncoding.UTF8を渡しています。これにより、パソコンに対して「このファイルは必ずUTF-8で書いてね」と念押ししていることになります。

4. XML操作でのエンコーディング指定の重要性

4. XML操作でのエンコーディング指定の重要性
4. XML操作でのエンコーディング指定の重要性

XML(エックスエムエル)は、JSONよりも古くから使われているデータ形式で、タグを使ってデータを囲むのが特徴です。設定ファイルなどでよく見かけます。XMLの場合、ファイルの冒頭に「このファイルはこの文字形式で書いてあります」という宣言(XML宣言)を入れるのがルールです。

C#でXMLを扱う場合、XmlWriterという道具を使います。この道具に設定(XmlWriterSettings)を渡すことで、エンコーディングを自由に変えることができます。もしこれを忘れると、読み込むソフトによっては中身が読めなくなってしまうことがあります。

5. XMLWriterを使って特定の文字コードで保存する

5. XMLWriterを使って特定の文字コードで保存する
5. XMLWriterを使って特定の文字コードで保存する

次に、XMLファイルを作るときにエンコーディングを指定する具体的なコード例を紹介します。ここでは、日本語環境で根強い人気があるShift-JISを指定する方法を見てみましょう。

※最近のC#ではShift-JISを使うためにCodePagesEncodingProviderという準備が必要になることがありますが、まずは基本の流れを押さえましょう。


using System;
using System.Text;
using System.Xml;

// XMLの設定を準備
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true; // 見やすく字下げする
settings.Encoding = Encoding.UTF8; // 文字形式をUTF-8に指定

using (XmlWriter writer = XmlWriter.Create("data.xml", settings))
{
    writer.WriteStartDocument();
    writer.WriteStartElement("User");
    writer.WriteElementString("Name", "佐藤花子");
    writer.WriteEndElement();
    writer.WriteEndDocument();
}

Console.WriteLine("XMLファイルを作成しました。");

作成されたXMLの中身は以下のようになります。


<?xml version="1.0" encoding="utf-8"?>
<User>
  <Name>佐藤花子</Name>
</User>

このように、一行目にencoding="utf-8"と入ることで、他のプログラムがこのファイルを読んだ時に「あ、これはUTF-8で書いてあるんだな」と正しく判断できるようになります。

6. ファイルからJSONを読み込む時のデコード処理

6. ファイルからJSONを読み込む時のデコード処理
6. ファイルからJSONを読み込む時のデコード処理

書き込む時だけでなく、ファイルを読み込む時もエンコーディングを意識しなければなりません。保存した時と同じ形式で読み込まないと、プログラムの中で文字が化けてしまいます。テキストファイルからデータを読み取って、元のオブジェクトに戻す作業をデシリアライズと言います。


using System;
using System.IO;
using System.Text;

// ファイルから全ての文字をUTF-8として読み込む
string loadedJson = File.ReadAllText("user.json", Encoding.UTF8);

Console.WriteLine("読み込んだ内容:");
Console.WriteLine(loadedJson);

実行結果は以下のようになります。


読み込んだ内容:
{"Name":"田中太郎","Age":25}

もし保存した時と違うエンコーディングを指定して読み込むと、田中太郎という部分が???のようになったり、変な漢字が並んだりします。これが「読み込み時の文字化け」です。

7. 日本語特有のShift-JISを扱う場合の注意点

7. 日本語特有のShift-JISを扱う場合の注意点
7. 日本語特有のShift-JISを扱う場合の注意点

現在のプログラミングではUTF-8が推奨されていますが、古い業務システムやExcelで開くためのCSVファイル、古いXMLファイルなどではShift-JISという形式が必要になることがあります。C#の標準状態ではShift-JISが使えない場合があるため、以下のコードのように「登録」の作業が必要になることを覚えておきましょう。


using System;
using System.IO;
using System.Text;

// 1. Shift-JISを使えるように登録する(おまじない)
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

// 2. Shift-JISを指定して保存
Encoding sjis = Encoding.GetEncoding("shift-jis");
File.WriteAllText("sjis.txt", "日本語テキスト", sjis);

Console.WriteLine("Shift-JISで保存しました。");

このように、Encoding.GetEncoding("shift-jis")を使うことで、特定の名前の文字形式を呼び出すことができます。これはJSONでもXMLでも、通常のテキストファイルでも共通の考え方です。

8. ストリームを使った高度なエンコーディング指定

8. ストリームを使った高度なエンコーディング指定
8. ストリームを使った高度なエンコーディング指定

大きなデータを扱う場合、一度に全ての文字を読み込むのではなく、少しずつ流すように処理する「ストリーム」という仕組みを使います。このストリームを使う場合でも、StreamWriterStreamReaderという道具の入り口でエンコーディングを指定できます。

これは、水道の蛇口(ストリーム)に、どの種類の水(エンコーディング)を流すかを決めるフィルターを取り付けるようなイメージです。初心者の方には少し難しいかもしれませんが、「データの通り道でも文字の種類を決められるんだな」と思っておけば十分です。

9. 文字化けが発生した時のチェックリスト

9. 文字化けが発生した時のチェックリスト
9. 文字化けが発生した時のチェックリスト

もしプログラムを作っていて文字化けが起きてしまったら、以下のポイントを順番に確認してみましょう。これらはプロのエンジニアでもよく確認する項目です。

  • 書き込み時の指定: File.WriteAllTextなどで正しいエンコーディングを指定しているか?
  • 読み込み時の指定: 書き込んだ時と「全く同じ」エンコーディングで読み込んでいるか?
  • エディタの表示: メモ帳やVSCodeなど、確認に使っているソフト側の設定がズレていないか?
  • ライブラリの既定値: 使っている機能(System.Text.Jsonなど)が、勝手に別の形式に変換していないか?

特に、JSONを扱う最新のライブラリは、日本語を \uXXXX という形式(Unicodeエスケープ)で出力することがあります。これは文字化けではなく、JSONの仕様上「安全な形式」に変換されているだけなので、読み込めば元に戻ります。心配しすぎないようにしましょう。

10. まとめ:正しいエンコーディングで快適なC#開発

10. まとめ:正しいエンコーディングで快適なC#開発
10. まとめ:正しいエンコーディングで快適なC#開発

エンコーディングは、一見地味で難しそうに感じますが、仕組みを理解してしまえば文字化けは怖くありません。基本はUTF-8を使い、どうしても必要な時だけ他の形式を指定するというルールを守れば、ほとんどのトラブルは防げます。

JSONやXMLを操作する際、常に「このデータの文字形式は何かな?」と意識する癖をつけることで、データの受け渡しがスムーズになります。今回学んだEncoding.UTF8Encoding.GetEncodingを活用して、ユーザーに優しい日本語対応のプログラムを作ってみてくださいね。

カテゴリの一覧へ
新着記事
New1
C#
C#のJSON・XML操作を完全解説!文字化けを防ぐエンコーディング指定の基本
New2
C#
C#の再帰メソッドの基本と注意点をわかりやすく解説
New3
C#
C#のforeachループを完全ガイド!初心者でもわかるコレクション操作の基本
New4
C#
C#でJSON・XMLファイルを読み書きする方法を完全解説!初心者向けの簡単ガイド
人気記事
No.1
Java&Spring記事人気No1
C#
C#のstaticクラスとstaticメソッドの基本と使い方をやさしく解説!
No.2
Java&Spring記事人気No2
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.3
Java&Spring記事人気No3
COBOL
COBOLのCOPY句の使い方を完全ガイド!初心者でもわかる共通部品の再利用方法
No.4
Java&Spring記事人気No4
COBOL
COBOLのIF文と条件分岐を徹底解説!複雑化を防ぐコーディング規約
No.5
Java&Spring記事人気No5
C#
C#のLINQでOrderByを使った並び替えを完全ガイド!初心者でもわかるソート方法
No.6
Java&Spring記事人気No6
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説
No.7
Java&Spring記事人気No7
C#
C#のLINQでFirstとFirstOrDefaultの違いと使い方を完全解説!初心者向けガイド
No.8
Java&Spring記事人気No8
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!