<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://snow-stack.net/feed.xml" rel="self" type="application/atom+xml" /><link href="https://snow-stack.net/" rel="alternate" type="text/html" /><updated>2026-06-07T11:42:26+00:00</updated><id>https://snow-stack.net/feed.xml</id><title type="html">Snow Stack</title><subtitle>技術ブログ</subtitle><author><name>snow-stack</name></author><entry><title type="html">.NETのGUIアーキテクチャ一覧公開のお知らせ</title><link href="https://snow-stack.net/%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B/2026/04/19/dotnet_GUI_%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B.html" rel="alternate" type="text/html" title=".NETのGUIアーキテクチャ一覧公開のお知らせ" /><published>2026-04-19T00:00:00+00:00</published><updated>2026-04-19T00:00:00+00:00</updated><id>https://snow-stack.net/%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B/2026/04/19/dotnet_GUI_%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B</id><content type="html" xml:base="https://snow-stack.net/%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B/2026/04/19/dotnet_GUI_%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B.html"><![CDATA[<p>「.NET 10 の画面有りアーキテクチャの解説とサンプルコード」を公開したことを、お知らせします。</p>

<p><a href="https://snow-stack.net/dotnet10-GUI-architecture-list/">.NET 10 の画面有りアーキテクチャの解説とサンプルコード</a></p>

<p>（2026年4月25日、Avalonia UI の解説とサンプルを追記しました）</p>

<p><a href="/avaloniaui-license-guide/">Avalonia UI のライセンス規定を解説します</a></p>

<p>（2026年5月9日、Avalonia UI のライセンスの解説記事を公開しました）</p>

<h2 id="サンプルプログラム公開の理由">サンプルプログラム公開の理由</h2>

<p>この記事とサンプルコードを作成した理由としては、.NET はその内容をよく誤解されることが多く、誤解を解消する上で、分かりやすい解説と具体的なサンプルプログラムを見せる必要があると考えたからです。</p>

<p>「.NET の誤解」の例としては、以下の様な物があります。</p>

<p>「.NET は Windows でしか動かない」</p>

<p>「ASP.NET は一つの技術である」「ASP.NET が使える（開発経験がある）」</p>

<p>「C# は C/C++ 系の開発言語である」</p>

<p>等々は、代表的なものです。
「Java と javascript の違いが分からない」と同じようなものです。</p>

<p>ITシステム開発の現場には、ITエンジニアだけが携わっているわけではなく、業務担当者や営業担当などITエンジニアではない人々も多く関わっていますから、こういう誤解は無くなりません。</p>

<p>ただ、説明しなければ誤解も無くならないので、このネット記事のような媒体で地道に解説していくしかありません。</p>

<p>上記の誤解について簡単に解説すると以下のようになります。</p>

<h3 id="誤解1net-は-windows-でしか動かない">誤解1「.NET は Windows でしか動かない」</h3>

<p>.NET には 旧 .NET Framework と 最新の .NET(Core) の二種類があり、Windows でしか動作しないのは、旧 .NET Framework だけであり、最新の .NET(Core) は Windows だけではなく、macOS,Linux,iOS,Android で動作します。
.NET 10 は、.NET(Core) です。</p>

<h3 id="誤解2aspnet-は一つの技術である">誤解2「ASP.NET は一つの技術である」</h3>

<p>.NET 系の求人には「ASP.NETの開発経験がある」という条件をよく見かけますし、IT人材系の営業職の人々も「ASP.NET は一つの技術である」「ASP.NETの開発経験があれば、ASP.NETは全て扱える」という認識の人々が圧倒的に多数派です。</p>

<p>この認識は、かなり大雑把すぎて、ほぼ間違っており、様々なトラブルの原因になっています。</p>

<p>この種類の誤解を解消したかったのも、サンプルプログラムと解説記事を公開した理由の一つです。</p>

<p>「.NET 10 の画面有りアーキテクチャの解説とサンプルコード」を読んで頂ければ分かりますが、ASP.NETとはMicrosoft が .NET技術で提供するWeb技術全般に付けているブランド名であり、ASP.NETブランドの中に様々な技術製品やアーキテクチャが提供されています。</p>

<p>つまり、「ASP.NET は一つの技術である」という認識は間違いであり、「ASP.NETの中に様々な技術製品が存在する」のが真実です。</p>

<p>ざっくりと例を挙げると、ASP.NET WebForms , ASP.NET Core MVC , ASP.NET Core Razor Pages , ASP.NET Core Web API , ASP.NET Core gRPC Service , ASP.NET Minimal API といった技術製品が提供されています。</p>

<p>これらの解説は、「.NET 10 の画面有りアーキテクチャの解説とサンプルコード」の中に書いているので、ここでは解説しません。</p>

<p>例えば、ASP.NET WebForms の開発経験のある人材は、ASP.NET Core MVC や ASP.NET Core Razor Pages を扱う事はできません。逆も同様です。
（ASP.NET WebForms は、旧.NET Framework の技術で既に廃止されております。Core と付く物は全て .NET (Core) の技術です）</p>

<p>ASP.NET Core Web API の開発経験のある人も ASP.NET Core gRPC Service は簡単には扱えないでしょう。</p>

<p>IT人材の募集を行う方は、ASP.NET の中のどの技術の開発経験を求めるのか、具体的に記載した方が良いですし、営業や管理職の方々も、そのぐらいの認識は持っておくべきだと思います。</p>

<p>この手の疑問は、生成AIに質問すれば分かる事なので、そろそろ調べておくべきでしょう。</p>

<p>様々なトラブルの原因は、技術を要求する側の雑な認識の方にあるケースが少なくないのです。</p>

<h3 id="誤解3c-は-cc-系の開発言語である">誤解3「C# は C/C++ 系の開発言語である」</h3>

<p>これは「Java と javascript の違いが分からない」人々と同様の人々ですね。</p>

<p>C# は、<a href="https://learn.microsoft.com/ja-jp/dotnet/standard/clr">CLR</a>  という .NET の仮想環境で動作するマネージドコードを主に開発するために作られた開発言語であり、その位置づけや機能特性は、Java に似た物になります。CLR は JavaVM に相当する VM（仮想マシン）です。</p>

<p>C言語やC++は、ネイティブコードを生成する開発言語なので、C#とは似ても似つかぬ言語です。</p>

<p>現代の開発言語は全て、C言語とC++を祖先として、言語の文法などを作成しているので、C#もC言語とC++を祖先としていますが、それならば Java も PHP も Go も Python もC言語とC++由来の言語と言えます。</p>

<p>「C#がC言語やC++系統の言語である」という認識に、正当性を見いだすのは難しいです。
無駄に誤解とトラブルを招くだけで、有害な認識だと思います。</p>

<h3 id="他にも色々ある">他にも色々ある</h3>

<p>ここでは .NET の話だけを挙げましたが、他の技術でも同様の誤解が蔓延していると思います。</p>

<p>いちいち例を挙げても切りが無いので挙げませんが、「Swift と SwiftUI を混同している」とか「Git と GitHub を混同している」とか「WSL と Git Bash を混同している」とか、たくさんあるでしょう。</p>

<p>最近広まりつつある Blazor では、Razorコンポーネントがありますが、これを ASP.NET の Razorページと混同する人もこれから増えていくでしょう。</p>

<p>これらの誤解は、誤解する方も悪いですが、説明しない方の責任もあるので、ブログ記事などで地道に解説記事を書いておくのが、誤解を払拭する最低限の努力と言えるでしょう。</p>

<p>解説がない状況では、誤解する者を批判することも、正当性の面で苦しくなります。</p>

<h2 id="サンプルコードについて">サンプルコードについて</h2>

<p>サンプルコードの使い方は、「.NET 10 の画面有りアーキテクチャの解説とサンプルコード」の中で必要最小限書いてあります。</p>

<p>GitHub リポジトリのサンプルコードの README.md など、まだぜんぜん書いていませんが、これから少しずつ書いていくつもりです。</p>

<p>最小限、解説記事とサンプルコードだけ完成した時点で公開しています。今後も細部の修正は行いますので、ご了承ください。</p>

<p>リリースや配布の機能は作っていないので、現状では IDE でソリューションを開いて起動するしかありません。</p>

<h3 id="ライセンスについて">ライセンスについて</h3>

<p>GitHub リポジトリのサンプルコード IssueBoard にはライセンスの記載がありませんが、全て MITライセンス とお考えください。</p>

<p>詳細は、後日 README.md などに書いていくつもりです。</p>

<p>今は、この記事で暫定的に「IssueBoard は MITライセンスである」と宣言しておきます。</p>

<p>MITライセンスは、このプログラムを利用・再配布する場合、著作権表示とライセンス条文を、ソフトウェアの複製または実質的部分に含めることを義務づけるライセンスです。また、本ソフトウェアは無保証であり、利用者の自己責任で使用することに合意することが求められます。</p>

<p>この条件を受け入れることを要求するライセンス規定です。</p>

<p>これは、私だけでは無く、世界の MITライセンス 全てに当てはまる条件なので、覚えておいてください。</p>

<p>商用利用は制限されませんが、利用者の自己責任での利用が求められます。</p>

<p>以上、お知らせでした。</p>]]></content><author><name>snow-stack</name></author><category term="お知らせ" /><category term=".NETテクノロジー" /><category term=".NET GUIアーキテクチャ" /><summary type="html"><![CDATA[「.NET 10 の画面有りアーキテクチャの解説とサンプルコード」を公開したことを、お知らせします。 .NET 10 の画面有りアーキテクチャの解説とサンプルコード （2026年4月25日、Avalonia UI の解説とサンプルを追記しました） Avalonia UI のライセンス規定を解説します （2026年5月9日、Avalonia UI のライセンスの解説記事を公開しました） サンプルプログラム公開の理由 この記事とサンプルコードを作成した理由としては、.NET はその内容をよく誤解されることが多く、誤解を解消する上で、分かりやすい解説と具体的なサンプルプログラムを見せる必要があると考えたからです。 「.NET の誤解」の例としては、以下の様な物があります。 「.NET は Windows でしか動かない」 「ASP.NET は一つの技術である」「ASP.NET が使える（開発経験がある）」 「C# は C/C++ 系の開発言語である」 等々は、代表的なものです。 「Java と javascript の違いが分からない」と同じようなものです。 ITシステム開発の現場には、ITエンジニアだけが携わっているわけではなく、業務担当者や営業担当などITエンジニアではない人々も多く関わっていますから、こういう誤解は無くなりません。 ただ、説明しなければ誤解も無くならないので、このネット記事のような媒体で地道に解説していくしかありません。 上記の誤解について簡単に解説すると以下のようになります。 誤解1「.NET は Windows でしか動かない」 .NET には 旧 .NET Framework と 最新の .NET(Core) の二種類があり、Windows でしか動作しないのは、旧 .NET Framework だけであり、最新の .NET(Core) は Windows だけではなく、macOS,Linux,iOS,Android で動作します。 .NET 10 は、.NET(Core) です。 誤解2「ASP.NET は一つの技術である」 .NET 系の求人には「ASP.NETの開発経験がある」という条件をよく見かけますし、IT人材系の営業職の人々も「ASP.NET は一つの技術である」「ASP.NETの開発経験があれば、ASP.NETは全て扱える」という認識の人々が圧倒的に多数派です。 この認識は、かなり大雑把すぎて、ほぼ間違っており、様々なトラブルの原因になっています。 この種類の誤解を解消したかったのも、サンプルプログラムと解説記事を公開した理由の一つです。 「.NET 10 の画面有りアーキテクチャの解説とサンプルコード」を読んで頂ければ分かりますが、ASP.NETとはMicrosoft が .NET技術で提供するWeb技術全般に付けているブランド名であり、ASP.NETブランドの中に様々な技術製品やアーキテクチャが提供されています。 つまり、「ASP.NET は一つの技術である」という認識は間違いであり、「ASP.NETの中に様々な技術製品が存在する」のが真実です。 ざっくりと例を挙げると、ASP.NET WebForms , ASP.NET Core MVC , ASP.NET Core Razor Pages , ASP.NET Core Web API , ASP.NET Core gRPC Service , ASP.NET Minimal API といった技術製品が提供されています。 これらの解説は、「.NET 10 の画面有りアーキテクチャの解説とサンプルコード」の中に書いているので、ここでは解説しません。 例えば、ASP.NET WebForms の開発経験のある人材は、ASP.NET Core MVC や ASP.NET Core Razor Pages を扱う事はできません。逆も同様です。 （ASP.NET WebForms は、旧.NET Framework の技術で既に廃止されております。Core と付く物は全て .NET (Core) の技術です） ASP.NET Core Web API の開発経験のある人も ASP.NET Core gRPC Service は簡単には扱えないでしょう。 IT人材の募集を行う方は、ASP.NET の中のどの技術の開発経験を求めるのか、具体的に記載した方が良いですし、営業や管理職の方々も、そのぐらいの認識は持っておくべきだと思います。 この手の疑問は、生成AIに質問すれば分かる事なので、そろそろ調べておくべきでしょう。 様々なトラブルの原因は、技術を要求する側の雑な認識の方にあるケースが少なくないのです。 誤解3「C# は C/C++ 系の開発言語である」 これは「Java と javascript の違いが分からない」人々と同様の人々ですね。 C# は、CLR という .NET の仮想環境で動作するマネージドコードを主に開発するために作られた開発言語であり、その位置づけや機能特性は、Java に似た物になります。CLR は JavaVM に相当する VM（仮想マシン）です。 C言語やC++は、ネイティブコードを生成する開発言語なので、C#とは似ても似つかぬ言語です。 現代の開発言語は全て、C言語とC++を祖先として、言語の文法などを作成しているので、C#もC言語とC++を祖先としていますが、それならば Java も PHP も Go も Python もC言語とC++由来の言語と言えます。 「C#がC言語やC++系統の言語である」という認識に、正当性を見いだすのは難しいです。 無駄に誤解とトラブルを招くだけで、有害な認識だと思います。 他にも色々ある ここでは .NET の話だけを挙げましたが、他の技術でも同様の誤解が蔓延していると思います。 いちいち例を挙げても切りが無いので挙げませんが、「Swift と SwiftUI を混同している」とか「Git と GitHub を混同している」とか「WSL と Git Bash を混同している」とか、たくさんあるでしょう。 最近広まりつつある Blazor では、Razorコンポーネントがありますが、これを ASP.NET の Razorページと混同する人もこれから増えていくでしょう。 これらの誤解は、誤解する方も悪いですが、説明しない方の責任もあるので、ブログ記事などで地道に解説記事を書いておくのが、誤解を払拭する最低限の努力と言えるでしょう。 解説がない状況では、誤解する者を批判することも、正当性の面で苦しくなります。 サンプルコードについて サンプルコードの使い方は、「.NET 10 の画面有りアーキテクチャの解説とサンプルコード」の中で必要最小限書いてあります。 GitHub リポジトリのサンプルコードの README.md など、まだぜんぜん書いていませんが、これから少しずつ書いていくつもりです。 最小限、解説記事とサンプルコードだけ完成した時点で公開しています。今後も細部の修正は行いますので、ご了承ください。 リリースや配布の機能は作っていないので、現状では IDE でソリューションを開いて起動するしかありません。 ライセンスについて GitHub リポジトリのサンプルコード IssueBoard にはライセンスの記載がありませんが、全て MITライセンス とお考えください。 詳細は、後日 README.md などに書いていくつもりです。 今は、この記事で暫定的に「IssueBoard は MITライセンスである」と宣言しておきます。 MITライセンスは、このプログラムを利用・再配布する場合、著作権表示とライセンス条文を、ソフトウェアの複製または実質的部分に含めることを義務づけるライセンスです。また、本ソフトウェアは無保証であり、利用者の自己責任で使用することに合意することが求められます。 この条件を受け入れることを要求するライセンス規定です。 これは、私だけでは無く、世界の MITライセンス 全てに当てはまる条件なので、覚えておいてください。 商用利用は制限されませんが、利用者の自己責任での利用が求められます。 以上、お知らせでした。]]></summary></entry><entry><title type="html">mfsr-mfprobe の winget と nuget.org でのリリース開始のお知らせ</title><link href="https://snow-stack.net/%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B/2026/03/26/mfsr%E3%81%AEwinget%E3%81%A8nuget%E3%81%A7%E3%81%AE%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E9%96%8B%E5%A7%8B.html" rel="alternate" type="text/html" title="mfsr-mfprobe の winget と nuget.org でのリリース開始のお知らせ" /><published>2026-03-26T00:00:00+00:00</published><updated>2026-03-26T00:00:00+00:00</updated><id>https://snow-stack.net/%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B/2026/03/26/mfsr%E3%81%AEwinget%E3%81%A8nuget%E3%81%A7%E3%81%AE%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E9%96%8B%E5%A7%8B</id><content type="html" xml:base="https://snow-stack.net/%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B/2026/03/26/mfsr%E3%81%AEwinget%E3%81%A8nuget%E3%81%A7%E3%81%AE%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E9%96%8B%E5%A7%8B.html"><![CDATA[<p>これまで、mfsr と mfprobe は、実行ファイルを .zip で配布して、ユーザーさんに自分でPathの通ったフォルダーに配置してもらっていました。</p>

<h2 id="winget-でのインストールが可能になりました">winget でのインストールが可能になりました</h2>

<p>先日、Windows 版は winget によるリリースを開始し、Windows標準の winget install コマンドで、簡単に mfsr と mfprobe をインストールできるようになりました。</p>

<p>rmsmf と txprobe は、これまでと同じで .zip ファイルでのインストールする方式のままです。</p>

<p>私としては、.NET Framework 4.8 でビルドしている rmsmf と txprobe よりも、.NET10 でビルドしている mfsr と mfprobe を極力使用して頂きたいので、このようにしました。</p>

<h2 id="macos-と-linux-os-へ対応しました">macOS と Linux OS へ対応しました</h2>

<p>元々、.NET10 で開発していますから、macOS と Linux OS でもリリースすれば動作するように開発しています。</p>

<p>しかし、これまでは Mac と Linux へのリリース手段を提供していませんでした。</p>

<p>リリースに時間がかかった理由として、macOS と Linux OS はCPUの種類やカーネルのバージョンなどの種類が多く、各種の環境に合わせたネイティブコードでのリリースが困難になるため、どのようなリリース方法が良いか判断に迷ったからです。</p>

<p>Windows版は、Native AOT によりネイティブコードでリリースしています。
winget でインストールする mfsr と mfprobe はネイティブコード版です。</p>

<p>今回、macOS と Linux OS に対しては、.NET10 のマネージドコードのアセンブリで提供することにしました。</p>

<p>マネージドコードの実行には .NET10 の Runtime（ランタイム） が必要になります。</p>

<p>しかし、.NET10 Runtime が、CPUの違いやカーネル・glibc などの違いを吸収してくれるので、OS に .NET10 Runtime さえインストールされていれば、どこの環境でも稼働するメリットがあります。</p>

<p>Mac には、インテルCPU版・Apple Silicon版・A18 Pro版と三種類のCPUがあり、macOSのバージョンも新旧でいくつか並行して提供されています。</p>

<p>Linuxはディストリビューションが多数ありカーネルやglibcのバージョンも多数並行して提供されています。</p>

<p>これら全てにネイティブコードを提供することは、難しいと思います。</p>

<p>これらの違いは、 .NET10 Runtime に吸収してもらい、mfsr と mfprobe は Runtime だけに合わせる形式での提供が、一番効率が良く信頼性も高いと考えました。</p>

<h2 id="アセンブリは-nugetorg-で提供しています">アセンブリは nuget.org で提供しています</h2>

<p>Windows版のネイティブコードは、winget で提供していますが、macOS と Linux OS へのマネージドコードでの提供は、nuget.org で提供しています。</p>

<p>インストールには dotnet コマンドで dotnet tool install によってインストールします。</p>

<h3 id="windowsでは二つの提供がある">Windowsでは二つの提供がある</h3>

<p>マネージドコードでの提供でお気づきの方もいると思いますが、nuget.org でのマネージドコードでの提供は、Windowsでもインストールすることが可能です。
つまり、Windowsでは winget 提供のネイティブコード版と、nuget.org 提供のマネージドコード版の二種類を提供していることになります。</p>

<p>私としては、Windows ではネイティブコード版を利用して欲しいと考えいますが、マネージドコード版もWindowsで同様に動作します。</p>

<p>正直なところ、どちらを使っても違いはほとんど無いです。</p>

<p>違いはマネージドコード版には .NET Runtime が必要なことぐらいです。
好きな方を利用してください。</p>

<p>なお、環境変数 Path の関係で両方使用することはできないと思います。</p>

<h2 id="zip-のダウンロードは必要無い">.zip のダウンロードは必要無い</h2>

<p>winget install でも dotnet tool install でも、事前に mfsr と mfprobe の .zip ファイルのダウンロードは必要無いです。</p>

<p>それぞれのコマンドを実行すればインストールできます。</p>

<p>具体的なインストール方法については、以下のページで解説しています。</p>

<p><a href="https://snow-stack.net/mfsr_install_guide/"><strong>mfsr-mfprobe インストール解説</strong></a></p>

<p>使い方の解説は、以前から紹介していますように、以下の二つのページで解説しています。</p>

<p><a href="https://snow-stack.net/tool_rmsmf_guide/">rmsmf-txprobe &amp; mfsr-mfprobe 使い方の分かりやすい解説</a></p>

<p><a href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/03/15/PowerShell%E3%81%AE%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E5%95%8F%E9%A1%8C%E3%81%AB%E7%B5%82%E6%AD%A2%E7%AC%A6%E3%82%92%E6%89%93%E3%81%A4-BOM-%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%87%AA%E5%9C%A8%E3%81%AB%E6%89%B1%E3%81%86%E6%96%B9%E6%B3%95.html">PowerShellの文字エンコーディング問題に終止符を打つ：BOM・改行コードを自在に扱う方法</a></p>

<p>以上、「お知らせ」でした。</p>]]></content><author><name>snow-stack</name></author><category term="お知らせ" /><category term="Character Encoding" /><category term="改行コード" /><category term="BOM" /><category term="mfprobe" /><category term="mfsr" /><category term="Windows ツール" /><category term="macOS ツール" /><category term="Linux OS ツール" /><summary type="html"><![CDATA[これまで、mfsr と mfprobe は、実行ファイルを .zip で配布して、ユーザーさんに自分でPathの通ったフォルダーに配置してもらっていました。 winget でのインストールが可能になりました 先日、Windows 版は winget によるリリースを開始し、Windows標準の winget install コマンドで、簡単に mfsr と mfprobe をインストールできるようになりました。 rmsmf と txprobe は、これまでと同じで .zip ファイルでのインストールする方式のままです。 私としては、.NET Framework 4.8 でビルドしている rmsmf と txprobe よりも、.NET10 でビルドしている mfsr と mfprobe を極力使用して頂きたいので、このようにしました。 macOS と Linux OS へ対応しました 元々、.NET10 で開発していますから、macOS と Linux OS でもリリースすれば動作するように開発しています。 しかし、これまでは Mac と Linux へのリリース手段を提供していませんでした。 リリースに時間がかかった理由として、macOS と Linux OS はCPUの種類やカーネルのバージョンなどの種類が多く、各種の環境に合わせたネイティブコードでのリリースが困難になるため、どのようなリリース方法が良いか判断に迷ったからです。 Windows版は、Native AOT によりネイティブコードでリリースしています。 winget でインストールする mfsr と mfprobe はネイティブコード版です。 今回、macOS と Linux OS に対しては、.NET10 のマネージドコードのアセンブリで提供することにしました。 マネージドコードの実行には .NET10 の Runtime（ランタイム） が必要になります。 しかし、.NET10 Runtime が、CPUの違いやカーネル・glibc などの違いを吸収してくれるので、OS に .NET10 Runtime さえインストールされていれば、どこの環境でも稼働するメリットがあります。 Mac には、インテルCPU版・Apple Silicon版・A18 Pro版と三種類のCPUがあり、macOSのバージョンも新旧でいくつか並行して提供されています。 Linuxはディストリビューションが多数ありカーネルやglibcのバージョンも多数並行して提供されています。 これら全てにネイティブコードを提供することは、難しいと思います。 これらの違いは、 .NET10 Runtime に吸収してもらい、mfsr と mfprobe は Runtime だけに合わせる形式での提供が、一番効率が良く信頼性も高いと考えました。 アセンブリは nuget.org で提供しています Windows版のネイティブコードは、winget で提供していますが、macOS と Linux OS へのマネージドコードでの提供は、nuget.org で提供しています。 インストールには dotnet コマンドで dotnet tool install によってインストールします。 Windowsでは二つの提供がある マネージドコードでの提供でお気づきの方もいると思いますが、nuget.org でのマネージドコードでの提供は、Windowsでもインストールすることが可能です。 つまり、Windowsでは winget 提供のネイティブコード版と、nuget.org 提供のマネージドコード版の二種類を提供していることになります。 私としては、Windows ではネイティブコード版を利用して欲しいと考えいますが、マネージドコード版もWindowsで同様に動作します。 正直なところ、どちらを使っても違いはほとんど無いです。 違いはマネージドコード版には .NET Runtime が必要なことぐらいです。 好きな方を利用してください。 なお、環境変数 Path の関係で両方使用することはできないと思います。 .zip のダウンロードは必要無い winget install でも dotnet tool install でも、事前に mfsr と mfprobe の .zip ファイルのダウンロードは必要無いです。 それぞれのコマンドを実行すればインストールできます。 具体的なインストール方法については、以下のページで解説しています。 mfsr-mfprobe インストール解説 使い方の解説は、以前から紹介していますように、以下の二つのページで解説しています。 rmsmf-txprobe &amp; mfsr-mfprobe 使い方の分かりやすい解説 PowerShellの文字エンコーディング問題に終止符を打つ：BOM・改行コードを自在に扱う方法 以上、「お知らせ」でした。]]></summary></entry><entry><title type="html">PowerShellの文字エンコーディング問題に終止符を打つ：BOM・改行コードを自在に扱う方法</title><link href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/03/15/PowerShell%E3%81%AE%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E5%95%8F%E9%A1%8C%E3%81%AB%E7%B5%82%E6%AD%A2%E7%AC%A6%E3%82%92%E6%89%93%E3%81%A4-BOM-%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%87%AA%E5%9C%A8%E3%81%AB%E6%89%B1%E3%81%86%E6%96%B9%E6%B3%95.html" rel="alternate" type="text/html" title="PowerShellの文字エンコーディング問題に終止符を打つ：BOM・改行コードを自在に扱う方法" /><published>2026-03-15T00:00:00+00:00</published><updated>2026-03-15T00:00:00+00:00</updated><id>https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/03/15/PowerShell%E3%81%AE%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E5%95%8F%E9%A1%8C%E3%81%AB%E7%B5%82%E6%AD%A2%E7%AC%A6%E3%82%92%E6%89%93%E3%81%A4%EF%BC%9ABOM%E3%83%BB%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%87%AA%E5%9C%A8%E3%81%AB%E6%89%B1%E3%81%86%E6%96%B9%E6%B3%95</id><content type="html" xml:base="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/03/15/PowerShell%E3%81%AE%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E5%95%8F%E9%A1%8C%E3%81%AB%E7%B5%82%E6%AD%A2%E7%AC%A6%E3%82%92%E6%89%93%E3%81%A4-BOM-%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%87%AA%E5%9C%A8%E3%81%AB%E6%89%B1%E3%81%86%E6%96%B9%E6%B3%95.html"><![CDATA[<p>PowerShell 上での文字エンコーディングの変換方法を解説します。<br />
これから文字エンコーディング、BOM、改行コードの3点について解説します。</p>

<p>以前から解説していますように、PowerShell 及び cmd では、現状のテキストファイルの文字エンコーディング・BOMの有無・改行コードの種類を確認する機能は提供されていません。<br />
PowerShellのスクリプトを作成すればある程度確認することはできますが、必要になる度にスクリプトを作成するのは、実用的ではありません。</p>

<p>この記事では、PowerShell 上での文字エンコーディング変換、BOMの変換、改行コードの変換方法の具体例を示しつつ、その問題を解説したいと思います。</p>

<p>コマンド操作例の中に登場する <code class="language-plaintext highlighter-rouge">$PWD</code> とは、PowerShell のカレントディレクトリを示す変数です。<br />
コマンド操作例の中には、.NETクラスのメソッドを呼び出す物も含まれています。<br />
PowerShellのカレントディレクトリと、.NETクラスのカレントディレクトリは異なるディレクトリである場合が多いので、コマンド中でカレントディレクトリを指定する場合は <code class="language-plaintext highlighter-rouge">$PWD</code> を使用するとどちらも同じディレクトリを指定できるので安全に操作できます。</p>

<p>コマンド操作例は、Windows PowerShell 5.1 でも PowerShell 7.x でも使い方に違いはありません。</p>

<h2 id="文字エンコーディングの確認">文字エンコーディングの確認</h2>

<p>PowerShell と cmd では、既存のテキストファイルの文字エンコーディングを確認する機能は提供されていません。<br />
しかし、PowerShell スクリプトにより、テキストファイルの先頭を4バイト読み込み、BOMのバイナリパターンを読むことは可能です。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$bytes = [System.IO.File]::ReadAllBytes("$PWD\text1.txt")
$bytes[0..3] | ForEach-Object { "{0:X2}" -f $_ }

# 実行結果(UTF-8 BOMあり)
EF
BB
BF
E3
</code></pre></div></div>

<p>この方法だと、BOMのある Unicode テキストならば文字エンコーディングを判別することが可能ですが、UTF-8などBOMの無い Unicode テキストや SHIFT_JIS テキストの場合は、文字エンコーディングを判別できません。<br />
Windows環境では、SHIFT_JIS、 UTF-8(BOM無し)、UTF-8(BOM有り)、UTF-16LE(BOM有り) が共存していますので、これでは実用になりません。</p>

<p>次は、文字エンコーディングの変換方法の実例です。</p>

<h3 id="通常のコマンドレットを使用する">通常のコマンドレットを使用する</h3>

<p>テキストファイルを入出力するコマンドレットには標準で <code class="language-plaintext highlighter-rouge">-Encoding</code> オプションが存在します。<br />
 <code class="language-plaintext highlighter-rouge">-Encoding</code> オプションにより、対象テキストファイルの文字エンコーディングを指定することができるので、複数のコマンドレットを組み合わせることで、文字エンコーディングの変換を行うことができます。<br />
以下は、SHIFT_JIS から UTF-8 へ変換する実例です。<br />
Get-Content で SHIFT_JIS テキストを読み込み、オブジェクトパイプラインで Set-Content に送り、Set-Content で UTF-8 の文字エンコーディングを指定して、新規テキストファイルに書き込みます。<br />
UTF-8のBOM無しと、UTF-8のBOM有りの二例を示します。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Shift_JIS -&gt; UTF-8 (BOM 無し)
Get-Content -Encoding SJIS "$PWD\text1.txt" | Set-Content -Encoding UTF8 "$PWD\text1set.txt"

# Shift_JIS -&gt; UTF-8 (BOM あり)
Get-Content -Encoding SJIS "$PWD\text1.txt" | Set-Content -Encoding UTF8BOM "$PWD\text1setb.txt"
</code></pre></div></div>

<p>このやり方は、あらかじめ読み取りテキストファイルの文字エンコーディングが分かっていないと使用できません。</p>

<p>また、対象テキストファイルに上書きすることは不可能です。<br />
必ず別のテキストファイルに出力することになります。</p>

<p>そのため、ワイルドカードを使用して複数ファイルを一括で処理することもできません。<br />
もし、複数ファイルを一括で処理する必要があるのなら、スクリプトを作成してループ処理を作成する必要があります。</p>

<p>手軽にできるものではありません。</p>

<h3 id="netクラスを使用する">.NETクラスを使用する</h3>

<p>PowerShell は .NETクラスのメソッドを直接使用することができます。<br />
ここでは、.NETクラスのメソッドを使用したやり方の実例を示します。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Shift_JIS → UTF-8 (BOM なし)
$sjis    = [System.Text.Encoding]::GetEncoding("shift_jis")
$utf8nobom = New-Object System.Text.UTF8Encoding($false)
$content = [System.IO.File]::ReadAllText("$PWD\text3.txt", $sjis)
[System.IO.File]::WriteAllText("$PWD\output3.txt", $content, $utf8nobom)

# UTF-8 → Shift_JIS
$sjis = [System.Text.Encoding]::GetEncoding("shift_jis")
$utf8 = [System.Text.Encoding]::UTF8
$content = [System.IO.File]::ReadAllText("$PWD\text2.txt", $utf8)
[System.IO.File]::WriteAllText("$PWD\output2.txt", $content, $sjis)

# Shift_JIS → UTF-8 (BOM 有り)
$sjis    = [System.Text.Encoding]::GetEncoding("shift_jis")
$utf8bom = New-Object System.Text.UTF8Encoding($true)  # BOM あり
$content = [System.IO.File]::ReadAllText("$PWD\text3.txt", $sjis)
[System.IO.File]::WriteAllText("$PWD\output3b.txt", $content, $utf8bom)
</code></pre></div></div>

<p>スクリプトを作成する場合は、このやり方が参考になる場合もありますが、通常の使用では先のコマンドレットを使用したやり方の方が、手軽で良いでしょう。</p>

<h2 id="bomの確認方法">BOMの確認方法</h2>

<p>文字エンコーディングの確認機能は提供されていないので、BOMの確認機能も存在しません。<br />
しかし、PowerShellはスクリプトから .NETクラスを直接使用できるので、BOMを確認するスクリプトを作成することはできます。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># BOM の確認
function Test-BOM {
    param([string]$Path)
    $bytes = [System.IO.File]::ReadAllBytes($Path)
    if ($bytes[0] -eq 0xEF -and $bytes[1] -eq 0xBB -and $bytes[2] -eq 0xBF) {
        return "UTF-8 with BOM"
    } elseif ($bytes[0] -eq 0xFF -and $bytes[1] -eq 0xFE) {
        return "UTF-16 LE with BOM"
    } elseif ($bytes[0] -eq 0xFE -and $bytes[1] -eq 0xFF) {
        return "UTF-16 BE with BOM"
    } else {
        return "BOM なし"
    }
}
Test-BOM "$PWD\text2.txt"
</code></pre></div></div>

<p>ご覧の通り、PowerShellスクリプトでBOMの確認は可能ですが、手軽とはいえません。</p>

<h2 id="bomを付ける">BOMを付ける</h2>

<p>対象テキストの文字エンコーディングが分かっているのなら、BOMを付けるのは、コマンドレットで比較的簡単にできます。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Get-Content  -Encoding UTF8 "$PWD\text1.txt" | Set-Content -Encoding UTF8BOM "$PWD\text1set.txt"
</code></pre></div></div>

<p>以下は .NETクラスを直接使用した実例です。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># BOM を付ける（UTF-8 BOM なし → BOM あり）
$utf8nobom = New-Object System.Text.UTF8Encoding($false)
$utf8bom   = New-Object System.Text.UTF8Encoding($true)
$content   = [System.IO.File]::ReadAllText("$PWD\text2.txt", $utf8nobom)
[System.IO.File]::WriteAllText("$PWD\text2out.txt", $content, $utf8bom)

# UTF-16 LE（BOM あり）で保存
$utf16le = [System.Text.Encoding]::Unicode   # = UTF-16 LE with BOM
$content = [System.IO.File]::ReadAllText("$PWD\text1.txt", [System.Text.Encoding]::UTF8)
[System.IO.File]::WriteAllText("$PWD\text1out16.txt", $content, $utf16le)
</code></pre></div></div>

<h2 id="bomを削除する">BOMを削除する</h2>

<p>BOMを付けるのも、BOMを削除するのも、コマンドレットの使い方は同じです。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Get-Content  -Encoding UTF8BOM "$PWD\text1.txt" | Set-Content -Encoding UTF8 "$PWD\text1set.txt"
</code></pre></div></div>

<p>.NETクラスを使用したやり方は、BOMのバイナリパターンを直接指定して削除し、BOMより後ろの全バイナリを、バイナリファイルとして書き込むやり方になります。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># BOM を除去（UTF-8 BOM あり → BOM なし）
$bytes = [System.IO.File]::ReadAllBytes("$PWD\text1.txt")
if ($bytes[0] -eq 0xEF -and $bytes[1] -eq 0xBB -and $bytes[2] -eq 0xBF) {
    $bytes = $bytes[3..($bytes.Length - 1)]
}
[System.IO.File]::WriteAllBytes("$PWD\text1out.txt", $bytes)
</code></pre></div></div>

<p>ご覧の通り、.NETクラスではバイナリ操作が必要になり、手軽とはいえません。</p>

<h2 id="改行コードの確認と変換">改行コードの確認と変換</h2>

<p>PowerShell と cmd は、改行コードについては、一貫して CR-LF を使用します。<br />
よって、改行コードを確認したり変換する機能はどこにも存在しません。<br />
.NETクラスを直接使用しスクリプトを作成して確認するしかありません。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># 改行コードの確認
$bytes = [System.IO.File]::ReadAllBytes("$PWD\text1.txt")
$hasCR = $bytes -contains 0x0D
$hasLF = $bytes -contains 0x0A

if ($hasCR -and $hasLF) { "CRLF (Windows)" 
} elseif ($hasCR)          { "CR のみ (Classic Mac)" 
} elseif ($hasLF)          { "LF のみ (Unix/Linux)" 
} else                     { "改行コードなし" }
</code></pre></div></div>

<p>改行コードの変換も、同様に.NETクラスを直接使用したスクリプトで行う必要があります。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># CRLF → LF
$enc     = [System.Text.Encoding]::UTF8
$content = [System.IO.File]::ReadAllText("$PWD\text1.txt", $enc)
$content = $content -replace "`r`n", "`n"
# WriteAllText は内部で環境依存の改行を追加しないよう、WriteAllBytes を使う
$outBytes = $enc.GetBytes($content)
[System.IO.File]::WriteAllBytes("$PWD\text1lf.txt", $outBytes)
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># LF → CRLF
$enc     = [System.Text.Encoding]::UTF8
$content = [System.IO.File]::ReadAllText("$PWD\text1.txt", $enc)
# 既に CRLF の箇所を二重変換しないよう、まず LF のみを対象にする
$content = $content -replace "(?&lt;!\r)`n", "`r`n"
$outBytes = $enc.GetBytes($content)
[System.IO.File]::WriteAllBytes("$PWD\text1crlf.txt", $outBytes)
</code></pre></div></div>

<h2 id="powershell標準機能の問題">PowerShell標準機能の問題</h2>

<p>PowerShell と cmd の環境では、SHIFT_JIS・UTF-8のBOM無しとBOM有り・UTF-16LEのBOM有りの四種類の文字エンコーディングテキストが、共存しています。<br />
UTF-8のBOM無しとBOM有りが両方存在しているため、BOMによる文字エンコーディングの識別が意味を持ちません。<br />
よって、ユーザーはBOMに頼らない文字エンコーディングの識別機能を必要とするのですが、そのような機能は標準では提供されておりません。</p>

<p>文字エンコーディングとBOMの変換機能は、標準コマンドレットの <code class="language-plaintext highlighter-rouge">-Encoding</code> オプションによって提供されています。<br />
しかし、テキストファイルの読み取りと、書き込みのコマンドが別々に提供されており、両者をパイプで繋いで利用する仕様なので、ワイルドカードなどによる複数一括処理ができません。<br />
また、対象ファイルに上書きすることもできないので、一度別のテキストファイルに出力して、元ファイルと入れ替える手間が掛かります。</p>

<p>改行コードについては、一貫して CR-LF を使用しているため、変換機能は存在しません。<br />
PowerShellスクリプトでバイナリレベルの操作編集を行う必要があります。</p>

<p>よって、PowerShellの標準機能だけでは、UNIX環境とWindows環境の間でのテキストファイルの交換に対応するのは、難しいのが実情です。</p>

<p>Windowsの文字エンコーディング問題の解説は、過去に書いておりますので、詳しく知りたい方は以下の記事をご覧下さい。</p>

<p><a href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/06/Windows-%E5%9B%BA%E6%9C%89%E3%81%AE%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E5%95%8F%E9%A1%8C.html">Windows 固有の文字エンコーディング問題</a></p>

<p><a href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/14/encoding-report.html">Windows 11 標準アプリ 文字エンコーディング対応状況まとめ</a></p>

<p><a href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/16/windows-console-encoding-report.html">Windowsコンソールの文字エンコーディング対応状況を検証する</a></p>

<p><a href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/18/windows11-encoding-blog.html">Windows 11 環境でのテキストファイル新規作成時のデフォルトエンコーディング検証の総まとめ</a></p>

<h2 id="一般的な問題の対策">一般的な問題の対策</h2>

<p>PowerShellの標準機能だけでは、対策として不十分なので、一般的にはUNIXツールをWindows環境に導入して、対策します。<br />
UNIXツールについては、以下の記事で詳しく解説しています。</p>

<p><a href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/03/06/Windows%E3%81%A7%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0-%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%89%B1%E3%81%86-UNIX%E3%83%84%E3%83%BC%E3%83%AB-%E3%81%AE%E7%8F%BE%E5%AE%9F%E3%81%A8%E8%AA%B2%E9%A1%8C.html">Windowsで文字エンコーディング・改行コードを扱う「UNIXツール」の現実と課題</a></p>

<h2 id="mfsr-と-mfprobe-による対策">mfsr と mfprobe による対策</h2>

<p>私は、このような標準機能の限界を克服するため、文字エンコーディング・BOM・改行コードを一括で検知・変換できる mfsr と mfprobe という対のツールを提供しています。</p>

<p>そのマニュアルは以下になります。</p>

<p><a href="https://snow-stack.net/tool_rmsmf_guide/">rmsmf-txprobe &amp; mfsr-mfprobe 使い方の分かりやすい解説</a></p>

<p>ここで、mfsr と mfprobe を使用した、文字エンコーディングの変換・BOMの追加と削除・改行コードの確認と変換の方法を、解説したいと思います。<br />
mfsr と mfprobe は、Window PowerShell 5.1 でも PowerShell 7.x でも cmd でも、同じように使用できます。<br />
PowerShell のオブジェクトパイプラインに依存しない仕様になっているので、PowerShell以外のシェルでも使用できます。</p>

<h3 id="mfprobe-による確認文字エンコーディングとbomと改行コード">mfprobe による確認（文字エンコーディングとBOMと改行コード）</h3>

<p>mfprobe は対象テキストファイルの文字エンコーディングとBOMの有無と改行コードの種類を探索して一度に表示します。<br />
ファイル名にはワイルドカードが使用でき、複数テキストファイルの確認が一度にできます。<br />
また、その結果をテキストファイルへ出力できます。<br />
オブジェクトパイプラインを経由しないので、cmd や Git Bash などでも使用可能です。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># 通常の使い方
mfprobe text1.txt

# 複数ファイルの一括確認
mfprobe *.txt

# サブディレクトリ配下ファイルの一括確認
mfprobe -d *.txt

# 確認結果のファイルへの出力
mfprobe -d *.txt -o:result.txt
</code></pre></div></div>

<p>注意事項として、Git Bash などUNIXシェルで使用する場合は、ワイルドカードをダブルクォーテーションで囲んで、UNIXシェルがワイルドカード展開をしないようにする必要があります。<br />
この点は mfprobe と mfsr で、同様です。</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># bash で使用するとき</span>
mfprobe <span class="s2">"*.txt"</span>
</code></pre></div></div>

<h3 id="mfsr-による文字エンコーディングの変換">mfsr による文字エンコーディングの変換</h3>

<p>文字エンコーディングを変換するときは、<code class="language-plaintext highlighter-rouge">mfprobe</code> ではなく <code class="language-plaintext highlighter-rouge">mfsr</code> を使用します。<br />
mfprobe は読み取り専用コマンドであり、更新する機能は <code class="language-plaintext highlighter-rouge">mfsr</code> に集約しています。<br />
テキストファイルの文字エンコーディングなどを確認するだけなら、誤って更新することを防ぐために、読み取り専用コマンドと更新コマンドを分けて開発しています。<br />
書き込み先文字エンコーディングは <code class="language-plaintext highlighter-rouge">/w:</code> オプションを使用して変換先の文字エンコーディングを指定します。<br />
オプションの頭文字は <code class="language-plaintext highlighter-rouge">/</code> (スラッシュ)でも <code class="language-plaintext highlighter-rouge">-</code> (ハイフン)でも、どちらでも良いです。<br />
<code class="language-plaintext highlighter-rouge">/w:</code> の <code class="language-plaintext highlighter-rouge">:</code> (コロン)はオプションのパラメータの指定子です。<code class="language-plaintext highlighter-rouge">:</code> の前後にはスペースを空けないように注意してください。<br />
 <code class="language-plaintext highlighter-rouge">:</code> (コロン)は、<code class="language-plaintext highlighter-rouge">=</code> (イコール)でも代用できます。
オプションの位置はコマンド名より後ろであれば順番は自由です。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># 通常の使い方
mfsr text1.txt /w:utf-8

# 読み取り文字エンコーディングの指定もする場合
mfsr /c:shift_jis text1.txt /w:utf-8

# 複数ファイルを一括変換
mfsr *.txt /w:utf-8

# : は = でも代用可能
mfsr *.txt /w=utf-8
</code></pre></div></div>

<h3 id="bomの変換方法">BOMの変換方法</h3>

<p>BOMについても、確認は <code class="language-plaintext highlighter-rouge">mfprobe</code> を、変換更新は <code class="language-plaintext highlighter-rouge">mfsr</code> を使用します。</p>

<h4 id="bomの確認">BOMの確認</h4>

<p>mfprobe は、ファイル名と文字エンコーディング名と改行コードの種類とBOMの有無を一度に表示するので、それらの確認は全て以下の様に使用して確認します。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mfprobe text1.txt

mfprobe *.txt
</code></pre></div></div>

<h4 id="bomの追加">BOMの追加</h4>

<p>BOMの更新には、<code class="language-plaintext highlighter-rouge">/b:</code> オプションを使用します。<br />
<code class="language-plaintext highlighter-rouge">/b:true</code> で「BOMを追加する」、<code class="language-plaintext highlighter-rouge">/b:false</code> で「BOMを削除する」と動作更新します。<br />
<code class="language-plaintext highlighter-rouge">/b:</code> オプションが無ければ現状維持になります。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># text1.txt にBOMを追加する
mfsr text1.txt /b:true

# 複数ファイルに対して一括でBOMを追加する
mfsr *.txt /b:true
</code></pre></div></div>

<h4 id="bomの削除">BOMの削除</h4>

<p>BOMの削除も「BOMの追加」の説明の通りに使用します。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># text1.txt のBOMを削除する
mfsr text1.txt /b:false

# 複数ファイル一括でBOMを削除する
mfsr *.txt /b:false
</code></pre></div></div>

<p>BOMの操作は、Unicode に対してのみ有効な操作で、Shift_JIS などBOMが存在しない文字エンコーディングの場合は、<code class="language-plaintext highlighter-rouge">/b:</code> オプションが無視されます。</p>

<h3 id="改行コードの変換方法">改行コードの変換方法</h3>

<p>改行コードについても、確認は <code class="language-plaintext highlighter-rouge">mfprobe</code> を、変換更新は <code class="language-plaintext highlighter-rouge">mfsr</code> を使用します。</p>

<h4 id="改行コードの確認">改行コードの確認</h4>

<p>mfprobe は、ファイル名と文字エンコーディング名と改行コードの種類とBOMの有無を一度に表示するので、それらの確認は全て以下の様に使用して確認します。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># 改行コードなど確認する
mfprobe text1.txt 

# サブディレクトリ配下も含めて複数ファイルを一括で確認する
mfprobe *.txt /d
</code></pre></div></div>

<h4 id="改行コードの変換">改行コードの変換</h4>

<p>改行コードの変換更新には、<code class="language-plaintext highlighter-rouge">/nl:</code> オプションを使用します。<br />
<code class="language-plaintext highlighter-rouge">/nl:crlf</code> で「Windows型改行コード」、<code class="language-plaintext highlighter-rouge">/nl:lf</code> で「UNIX型改行コード」に変換し更新します。<br />
<code class="language-plaintext highlighter-rouge">/nl:</code> オプションが無ければ、改行コードを変更しません。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># UNIX改行形式に変換する
mfsr text1.txt /nl:lf

mfsr text1.txt /nl:unix

# Windows改行形式に変換する(複数一括変換)
mfsr *.txt /nl:crlf

mfsr *.txt /nl:win
</code></pre></div></div>

<p>「Windows型改行コード」は、<code class="language-plaintext highlighter-rouge">/nl:crlf</code> 以外にも <code class="language-plaintext highlighter-rouge">/nl:win</code> や <code class="language-plaintext highlighter-rouge">/nl:w</code> も使用できます。<br />
「UNIX型改行コード」は、<code class="language-plaintext highlighter-rouge">/nl:lf</code> 以外にも <code class="language-plaintext highlighter-rouge">/nl:unix</code> や <code class="language-plaintext highlighter-rouge">/nl:u</code> も使用できます。</p>

<p>ちなみに <code class="language-plaintext highlighter-rouge">/nl</code> は <code class="language-plaintext highlighter-rouge">New Line</code> の略です。</p>

<h2 id="文字エンコーディング問題はまだまだ終わらない">文字エンコーディング問題は、まだまだ終わらない</h2>

<p>古い文字エンコーディング問題は、Windowsだけの問題ではなく、日本社会全般に横たわる問題です。<br />
特に歴史的経緯でWindowsに多くの問題が現れているだけであり、Windowsだけの問題ではないです。<br />
この辺の話は、以下の記事で解説しました。</p>

<p><a href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/01/12/%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91-%E3%81%AF%E3%81%AA%E3%81%9C%E7%B5%82%E3%82%8F%E3%82%89%E3%81%AA%E3%81%84-%E6%97%A5%E6%9C%AC%E3%81%AEIT%E3%82%92%E7%B8%9B%E3%82%8B%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%B7%B1%E3%81%84%E9%97%87.html">「文字化け」はなぜ終わらない？ 日本のITを縛る文字エンコーディングの深い闇</a></p>

<p>古い文字エンコーディング問題が一番大きな問題として現れているのは、Windowsよりも自治体情報システムの「外字」の問題でしょう。<br />
他にも医療系システムや金融機関のレガシーシステムなども問題です。<br />
いずれも、古いデータがペタバイト級のデータ量に及んでおり、コンバートもままならない状況と聞きます。</p>

<p>長期的には、UNIX標準に全てのテキスト規格が集約されていくことは、ほぼ確実の状勢なので、Windows環境の膨大なテキストのレガシーデータ問題は、これからも課題として存続し続けるでしょう。<br />
今後は、新たに改行コードが問題として現れてきそうな気がしています。</p>]]></content><author><name>snow-stack</name></author><category term="文字エンコーディング" /><category term="Character Encoding" /><category term="改行コード" /><category term="BOM" /><category term="mfprobe" /><category term="Windows ツール" /><summary type="html"><![CDATA[PowerShell 上での文字エンコーディングの変換方法を解説します。 これから文字エンコーディング、BOM、改行コードの3点について解説します。]]></summary></entry><entry><title type="html">Windowsで文字エンコーディング・改行コードを扱う「UNIXツール」の現実と課題</title><link href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/03/06/Windows%E3%81%A7%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0-%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%89%B1%E3%81%86-UNIX%E3%83%84%E3%83%BC%E3%83%AB-%E3%81%AE%E7%8F%BE%E5%AE%9F%E3%81%A8%E8%AA%B2%E9%A1%8C.html" rel="alternate" type="text/html" title="Windowsで文字エンコーディング・改行コードを扱う「UNIXツール」の現実と課題" /><published>2026-03-06T00:00:00+00:00</published><updated>2026-03-06T00:00:00+00:00</updated><id>https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/03/06/Windows%E3%81%A7%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%BB%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%89%B1%E3%81%86%E3%80%8CUNIX%E3%83%84%E3%83%BC%E3%83%AB%E3%80%8D%E3%81%AE%E7%8F%BE%E5%AE%9F%E3%81%A8%E8%AA%B2%E9%A1%8C</id><content type="html" xml:base="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/03/06/Windows%E3%81%A7%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0-%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%89%B1%E3%81%86-UNIX%E3%83%84%E3%83%BC%E3%83%AB-%E3%81%AE%E7%8F%BE%E5%AE%9F%E3%81%A8%E8%AA%B2%E9%A1%8C.html"><![CDATA[<p>前回の記事で、触れた「Windows 固有の文字エンコーディング問題」には、以下の問題があります。</p>

<p>「古い文字エンコーディングが少なくとも Shift_JIS, UTF-8,UTF-16LEの三つがあり確実に識別する手段は提供されていない」<br />
「UTF-8を使用する場合、BOM付きとBOM無しの両方が共存しており、その識別はユーザーの自己責任になっている」<br />
「WSLや Git などでUNIX環境とテキストファイルの相互交換する場合、CR・LF と LF の改行コード仕様の差異に手動で対処しなければならない」<br />
「これらの問題を解決するのに良いツールとして <code class="language-plaintext highlighter-rouge">file , iconv , nkf</code> というコマンド製品がUNIX環境で提供されている」<br />
「PowerShell や cmd では、文字エンコーディング・BOM・改行コードを確認する標準機能は提供されていない」</p>

<p>以上が、前回の記事で解説した内容の概要です。</p>

<p>この記事では、Windows 上で使用できる文字エンコーディングを確認したり、変換したりできる各種のツールについて、ここで解説したいと思います。<br />
もちろん、BOMや改行コードの確認・変換も含めて解説します。</p>

<p>前回の記事　:　<a href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/06/Windows-%E5%9B%BA%E6%9C%89%E3%81%AE%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E5%95%8F%E9%A1%8C.html">Windows 固有の文字エンコーディング問題</a></p>

<h2 id="問題の概要">問題の概要</h2>

<p>タイトルでは「Windows で使える…」と書いていますが、現実のところ文字エンコーディングとBOMと改行コードの確認と変換を行う標準的ツールは、UNIX環境で開発提供されており、それらをWindowsで使用するには、Windows環境にUNIXのシェルを導入しなければ使用する事ができません。<br />
タイトルの「…その問題について」とは、UNIXシェルでしか標準的ツールが使用できないことを示しています。<br />
PowerShell でも文字エンコーディングの変換とBOMの変換は可能ですが、改行コードの確認・変換や既存のテキストファイルの、文字エンコーディングとBOMの確認はできません。<br />
前回の記事「Windows 固有の文字エンコーディング問題」でも解説したように、Windows環境におけるテキストファイルの主な問題は、「BOM付きUTF-8」と「BOM無しUTF-8」と「Shift_JIS」のテキストファイルが混在していて、BOMだけではそれらを識別できない点にあります。<br />
そしてそれらを識別できるツールがUNIX環境でしか提供されていないのが、問題なのです。</p>

<p>この記事では、Windows環境で使用できる文字エンコーディング・BOM・改行コードの確認・変換ができる標準的ツール製品の紹介とその問題点を解説します。</p>

<p>PowerShellを説明すると長くなるので、別の記事で見送りたいと思います。</p>

<h2 id="unix環境の主要コマンドツール">UNIX環境の主要コマンドツール</h2>

<p>テキストファイルが使用している文字エンコーディングとBOMと改行コードの確認を行う標準的コマンドツールは以下の物になります。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">ツール</th>
      <th style="text-align: left">主な用途</th>
      <th style="text-align: left">日本国内での普及</th>
      <th style="text-align: left">海外での普及</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">iconv</td>
      <td style="text-align: left">エンコーディング変換</td>
      <td style="text-align: left">◎</td>
      <td style="text-align: left">◎（標準）</td>
    </tr>
    <tr>
      <td style="text-align: left">file</td>
      <td style="text-align: left">エンコーディング判別</td>
      <td style="text-align: left">◎</td>
      <td style="text-align: left">◎（標準）</td>
    </tr>
    <tr>
      <td style="text-align: left">dos2unix / unix2dos</td>
      <td style="text-align: left">改行コード変換</td>
      <td style="text-align: left">○</td>
      <td style="text-align: left">◎（標準的）</td>
    </tr>
    <tr>
      <td style="text-align: left">nkf</td>
      <td style="text-align: left">変換・判別・改行・BOM</td>
      <td style="text-align: left">◎（日本のみ）</td>
      <td style="text-align: left">△（ほぼ使われない）</td>
    </tr>
  </tbody>
</table>

<p>nkf（Network Kanji Filter）は日本語処理のために日本で開発されたツールで、海外ではほとんど使われません。海外では iconv + dos2unix の組み合わせが標準です。</p>

<p>世界的な意味での標準コマンドは、iconv , file , dos2unix , unix2dos です。<br />
nkf は日本で開発された日本語文字エンコーディングに特化したコマンドで、日本語以外では使用できません。その代わり日本語文字エンコーディングに関しては最も信頼できるツールと言えるでしょう。</p>

<p>世界的標準コマンドの iconv , file , dos2unix , unix2dos は、bash や zsh などのUNIXシェル環境でしか使用できません。<br />
PowerShell や cmd などの Windowsシェル環境では使用できません。</p>

<p><code class="language-plaintext highlighter-rouge">nkf</code>コマンドもオリジナルはUNIXシェル環境（bashやzsh）向けに開発されていますが、<code class="language-plaintext highlighter-rouge">nkf</code>に限りWindows環境に移植されたクローンが存在し、一応 Windowsシェル環境でも使用することができます。<br />
しかし、nkf のオリジナルコマンドが UNIXシェル環境で開発されているため、その仕様は UNIXシェル環境の仕様に最適化しています。当然のことです。<br />
よって、nkf を PowerShell や cmd などの Windows環境で使用すると、使えない機能がいくつかあり、現実的には nkf の真価を発揮できないのが現実です。<br />
これは nkf コマンドが悪いわけではなく、「Windowsに最適化したコマンドが存在しない」事が問題なのです。</p>

<p>次に、詳細を説明します。</p>

<h2 id="windows環境にunixシェルを導入する">Windows環境にUNIXシェルを導入する</h2>

<p>Windows環境でUNIXシェルを使用する方法は、いくつか存在します。</p>

<h3 id="wslwindows-subsystem-for-linux">WSL（Windows Subsystem for Linux）</h3>

<p>最も正攻法と言える使い方は、WSLを使用する方法です。<br />
WSLとは、Windowsが内部的に持っている Hyper-V の機構を使用して、LinuxカーネルをWindows上でエミュレーション実行して、Linuxの機能を丸ごと使用できる機能です。<br />
プログラマーが行うLinux上での開発作業のほとんどを、このWSLで実行可能です。<br />
WSL では Ubuntu、Debian、Kaliなど、いくつかのLInuxディストリビューションがアプリとして用意されており、Microsoft Store などから導入できるようになっています。</p>

<p>具体的な機能と使い方は、Microsoft 公式サイトで確認する事をお勧めします。</p>

<p><a href="https://learn.microsoft.com/ja-jp/windows/wsl/">Windows Subsystem for Linux のドキュメント</a></p>

<p>仮に WSL の Ubuntu を導入して、bash を使用した場合、そのストレージ領域は 仮想ディスク領域(VHD)が割り当てられますが、WSL・UbuntuからWindowsのストレージ領域にアクセスすることも可能です。<br />
具体的には、<code class="language-plaintext highlighter-rouge">/mnt/c/</code> ディレクトリが、Windowsでの <code class="language-plaintext highlighter-rouge">C:\\</code> フォルダを意味します。<br />
bash上で <code class="language-plaintext highlighter-rouge">cd /mnt/c</code> と実行すれば、Windowsの <code class="language-plaintext highlighter-rouge">C:\\</code> フォルダの内容を閲覧・操作できます。<br />
この仕組みにより、WSL・Ubuntuから全ての Windowsのストレージ領域にアクセスできます。<br />
この bash から iconv , file , dos2unix , unix2dos コマンドを使用して、 Windowsのテキストファイルの文字エンコーディングやBOMや改行コードの確認・変換を行うことができます。</p>

<h3 id="msys2">MSYS2</h3>

<p>Windows環境でUNIXライクなシェルを提供する環境です。<br />
Bashやcoreutils（ls, grep, sed, awkなど）を提供します。<br />
Arch Linuxのpacmanパッケージマネージャーを採用しており、ツールのインストール・管理が容易にできます。<br />
MinGW-w64ツールチェーン（GCC, Clangなど）を簡単に導入可能です。<br />
MSYS2は、OS自体をUNIX化するものではありません。提供しているのはあくまでUNIXの『ツール群』と『シェル環境』であり、一部のPOSIX APIをエミュレーションしてWindows APIの呼び出しに変換します。<br />
MinGWでビルドしたバイナリはWindows APIを直接呼び出すネイティブアプリになります。よって、MSYS2上からWindows用に作られたコマンドを呼び出すことも可能ですが、UNIXシェル環境に最適化していなければ正常に動作しません。<br />
dir や find などは動作します。VS Code が Windowsにインストールされていれば、code と打ち込むと VS Code が起動します。</p>

<p>以下のサイトから配布されています。</p>

<p><a href="https://www.msys2.org/">https://www.msys2.org/</a></p>

<p>詳しい使い方は、ここでは省略します。</p>

<h3 id="git-bash">Git Bash</h3>

<p>Git Bashは単独の製品ではなく、<strong>Git for Windows</strong>に含まれるコンポーネントです。配布元は以下の2つです。<br />
Git公式サイト: <a href="https://git-scm.com/install/windows">https://git-scm.com/install/windows</a><br />
Git for Windowsプロジェクト: <a href="https://gitforwindows.org/">https://gitforwindows.org/</a><br />
どちらからダウンロードしても同じインストーラーが取得できます。</p>

<p>Git for Windowsは、Git本体に加えて、コマンドラインで使うためのBASHエミュレーション（Git Bash）と、GUIツール（Git GUI）を提供します。</p>

<p>Git for Windowsは軽量なネイティブツールセットとして、GitのフルセットをWindows上で提供するものです。<br />
<strong>内部的にはMSYS2のランタイムを使って</strong>、Bash、ls、grep、sedなどのUNIXコマンドをWindows上で動かしています。<br />
つまりGit Bashは<strong>「MSYS2ベースのBash環境 ＋ Git」</strong>というパッケージです。</p>

<p><strong>もし、WSL を使用しないのなら、Windows上でUNIXシェルを使用するのに、最も相応しいのはこの Git Bash でしょう。</strong></p>

<p><a href="https://git-scm.com/download/win">https://git-scm.com/download/win</a> にアクセスすると、自動的にダウンロードが開始されます。x64版とARM64版があるので、お使いの環境に合ったものを選びます（通常はx64）。</p>

<h3 id="cygwin">Cygwin</h3>

<p>CygwinはRed Hat（現IBM）が中心となって開発してきたプロジェクトで、cygwin1.dllというPOSIX互換レイヤーを提供します。<br />
POSIX APIをWindows API上にエミュレーションするため、UNIX向けソースコードをほぼそのままコンパイル・実行できます。<br />
POSIX互換環境を構築しているので、Bash, X Window System, SSH, Python, Perl, gccなど非常に多くのパッケージが利用可能です。</p>

<p>ただし、Cygwin上でビルドしたバイナリはcygwin1.dllに依存するため、ネイティブWindowsアプリとしては配布しにくいです。</p>

<p>MSYS2では、ビルドしたアプリはWindowsアプリですが、CygwinではCygwinに依存したアプリになります。</p>

<p>UNIXエミュレーションの抽象化水準を比較すると、WSLが最も高く、次が Cygwin で、MSYS2 はシェルインターフェイスだけUNIXライクで中身はWindowsという抽象化水準になります。<br />
（WSL は完全に GNU Linux そのものです）</p>

<p>Cygwin の公式サイトは <a href="https://cygwin.com/"><strong>https://cygwin.com/</strong></a> です。ここからセットアッププログラムをダウンロードします。<br />
公式サイトから setup-x86_64.exe をダウンロードして実行します。64bit版のWindowsであればこちらを使います。</p>

<p>詳しい使い方は、ここでは省略します。</p>

<h3 id="windowsのunixシェル補足">WindowsのUNIXシェル補足</h3>

<p>UNIXシェル環境は、PowerShell や cmd とは使い方が異なります。<br />
簡単には説明できませんが、例えば ファイルパスの区切り文字は、PowerShell や cmd だとバックスラッシュですが、UNIXシェルではスラッシュです。<br />
PowerShell はオブジェクトパイプラインを実装していますが、UNIXシェルのパイプラインはバイトスルーです。<br />
ファイル一覧の取得や、検索、テキストファイルの表示など基本的なコマンドも異なります。<br />
ワイルドカードの展開手順も異なり、シェルスクリプトは高度に発達していて、その為の仕様も複雑です。<br />
環境変数・動作設定の仕様もWindowsとは大きく異なります。<br />
使ったことの無い人が、いきなり使えるものではありません。</p>

<p>UNIXシェル環境はプログラマにとっては馴染み深いものですが、主にExcelやWord、ブラウザ、企業業務システムを利用しているような一般ユーザーには、お勧めできるものではありません。</p>

<p>しかし、どうしてもUNIXシェル環境を使用するなら、<strong>WSLをお勧めします。</strong><br />
これは Windows の標準機能であり、完全な GNU Linux なので信頼性で最も勝ります。<br />
<strong>次にお勧めするのは、Git Bash です。</strong>これならデフォルトで iconv , file , dos2unix , unix2dos がインストールされているので導入が簡単です。<br />
Git Bash は MSYS2 を内蔵しているので、MSYS2 をお勧めする意味はありません。<br />
また、WSL が実現した現在では Cygwin を導入する意味も無いと思います。Cygwinもお勧めしません。</p>

<h2 id="主要コマンドツールの使い方世界標準">主要コマンドツールの使い方（世界標準）</h2>

<p>テキストファイルの文字エンコーディング・BOM・改行コードの確認と変換を行う、世界標準のコマンドは以下のコマンドです。</p>

<p><code class="language-plaintext highlighter-rouge">iconv , file , dos2unix , unix2dos</code></p>

<p>これら四つのコマンドは全て先に紹介した UNIXシェル環境でしか使用できません。<br />
PowerShell と cmd では、使用できません。</p>

<p>Git Bash の場合は、インストールした時点でこれらのコマンドが装備されています。<br />
WSLでUbuntuをインストールした場合は、apt install コマンドでそれぞれのコマンドをインストールできます。<br />
MSYS2やCygwinについては、説明を省略します。</p>

<p>コマンドの詳しい使い方は省略し、文字エンコーディング・BOM・改行コードの確認と変換のやり方だけ、簡単に説明します。<br />
（ちなみに iconv,dos2unix,unix2dos のオプションによるエンコーディング指定は大文字小文字を区別しません）</p>

<h3 id="文字エンコーディングの変換">文字エンコーディングの変換</h3>

<h4 id="エンコーディングの確認">エンコーディングの確認</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># file コマンド（標準・国内外共通）</span>
file <span class="nt">-i</span> input.txt          <span class="c"># Linux: MIMEタイプ形式で表示</span>
file <span class="nt">-I</span> input.txt          <span class="c"># macOS: 同上</span>

file input.txt		<span class="c"># 他の情報も表示されるが、オプション無しでも確認できる。</span>

</code></pre></div></div>

<h4 id="shift_jis--utf-8">Shift_JIS → UTF-8</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># iconv（国内外共通・推奨）</span>
iconv <span class="nt">-f</span> SHIFT_JIS <span class="nt">-t</span> UTF-8 input.txt <span class="o">&gt;</span> output.txt

<span class="c"># 上書きしたい場合</span>
iconv <span class="nt">-f</span> SHIFT_JIS <span class="nt">-t</span> UTF-8 input.txt <span class="nt">--output</span><span class="o">=</span>input.txt
<span class="c"># 上書きしたい場合（-oでも良い）</span>
iconv <span class="nt">-f</span> SHIFT_JIS <span class="nt">-t</span> UTF-8 input.txt <span class="nt">-oinput</span>.txt

</code></pre></div></div>

<h4 id="utf-8--shift_jis">UTF-8 → Shift_JIS</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># iconv</span>
iconv <span class="nt">-f</span> UTF-8 <span class="nt">-t</span> SHIFT_JIS input.txt <span class="o">&gt;</span> output.txt
</code></pre></div></div>

<h4 id="複数ファイルの一括変換bashzsh">複数ファイルの一括変換（bash/zsh）</h4>

<p>iconv は、上書きするとき –output オプションで「上書き対象ファイル名」を記入しなければならないため、複数ファイルを一括処理する場合は、シェルスクリプトの for 文でループ処理を書く必要があります。</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># iconv で *.txt を一括変換</span>
<span class="k">for </span>fn <span class="k">in</span> <span class="k">*</span>.txt
<span class="k">do
  </span>iconv <span class="nt">-f</span> shift_jis <span class="nt">-t</span> utf-8 <span class="s2">"</span><span class="k">${</span><span class="nv">fn</span><span class="k">}</span><span class="s2">"</span> <span class="nt">--output</span><span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">fn</span><span class="k">}</span><span class="s2">"</span>
<span class="k">done</span>
</code></pre></div></div>

<p><strong>iconv の注意点</strong>：変換できない文字があるとエラーで止まります。-c オプションで変換不能文字をスキップできます（iconv -f SHIFT_JIS -t UTF-8 -c input.txt）。</p>

<h3 id="bom-の付加除去">BOM の付加・除去</h3>

<h4 id="bom-の確認">BOM の確認</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 先頭バイトを16進で確認</span>
<span class="nb">head</span> <span class="nt">-c</span> 4 input.txt | xxd
<span class="c"># UTF-8 BOM: ef bb bf</span>
<span class="c"># UTF-16LE BOM: ff fe</span>

<span class="c"># file コマンド</span>
file input.txt   <span class="c"># "with BOM" と表示されることがある（環境依存）</span>

</code></pre></div></div>

<h4 id="utf-8-bom-の除去">UTF-8 BOM の除去</h4>

<p>世界標準のUNIXコマンドでは「BOMだけを付加・除去」する機能はありません。<br />
BOMだけを操作するならば、以下の様にBOMのバイナリを先頭に付加したり除去する操作を行うことになります。</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># sed（Linux/macOS 共通）</span>
<span class="nb">sed</span> <span class="nt">-i</span> <span class="s1">'s/^\xEF\xBB\xBF//'</span> input.txt        <span class="c"># Linux</span>
<span class="nb">sed</span> <span class="nt">-i</span> <span class="s1">''</span> <span class="s1">'s/^\xEF\xBB\xBF//'</span> input.txt     <span class="c"># macOS（-i の後に '' が必要）</span>

<span class="c"># tail（安全な方法）</span>
<span class="nb">tail</span> <span class="nt">-c</span> +4 input.txt <span class="o">&gt;</span> output.txt    <span class="c"># 先頭3バイトをスキップ</span>

<span class="c"># Python（環境依存が少ない）</span>
python3 <span class="nt">-c</span> <span class="s2">"
import sys
data = open('input.txt','rb').read()
open('output.txt','wb').write(data.lstrip(b'</span><span class="se">\x</span><span class="s2">ef</span><span class="se">\x</span><span class="s2">bb</span><span class="se">\x</span><span class="s2">bf'))
"</span>
</code></pre></div></div>

<h4 id="utf-8-bom-の付加">UTF-8 BOM の付加</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># printf で BOM を先頭に付加</span>
<span class="nb">printf</span> <span class="s1">'\xEF\xBB\xBF'</span> | <span class="nb">cat</span> - input.txt <span class="o">&gt;</span> output.txt

</code></pre></div></div>

<h4 id="utf-16le-への変換bom付き">UTF-16LE への変換（BOM付き）</h4>

<p>iconv の -t UTF-16LE 指定の場合は、BOM無しになりますが、<br />
-t UTF-16  指定の場合は、BOM付きになります。</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># iconv</span>
iconv <span class="nt">-f</span> UTF-8 <span class="nt">-t</span> UTF-16LE input.txt <span class="o">&gt;</span> output_nobom.txt
<span class="c"># BOM付き UTF-16LE</span>
<span class="nb">printf</span> <span class="s1">'\xff\xfe'</span> | <span class="nb">cat</span> - &lt;<span class="o">(</span>iconv <span class="nt">-f</span> UTF-8 <span class="nt">-t</span> UTF-16LE input.txt<span class="o">)</span> <span class="o">&gt;</span> output.txt


<span class="c"># iconv で UTF-16（自動でBOM付き）</span>
iconv <span class="nt">-f</span> UTF-8 <span class="nt">-t</span> UTF-16 input.txt <span class="o">&gt;</span> output.txt   <span class="c"># BOM自動付加</span>

</code></pre></div></div>

<h4 id="utf-16le--utf-8bom除去を含む">UTF-16LE → UTF-8（BOM除去を含む）</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># iconv（BOMがあっても自動処理される場合が多い）</span>
iconv <span class="nt">-f</span> UTF-16LE <span class="nt">-t</span> UTF-8 input.txt <span class="o">&gt;</span> output.txt

<span class="c"># BOMありUTF-16の場合</span>
iconv <span class="nt">-f</span> UTF-16 <span class="nt">-t</span> UTF-8 input.txt <span class="o">&gt;</span> output.txt   <span class="c"># BOM見て自動判別</span>

</code></pre></div></div>

<p>UTF-16 の場合は、UTF-16LE と UTF-16 のエンコーディング指定を使い分けることで、BOMの有無を操作できますが、UTF-8 ではできません。<br />
環境による違いもあると聞きますが未確認です。（自分の Ubuntu では BOM付きUTF-8 は扱えません）</p>

<h3 id="改行コードの変換">改行コードの変換</h3>

<h4 id="改行コードの確認">改行コードの確認</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># file コマンド</span>
file input.txt     <span class="c"># "CRLF line terminators" などと表示</span>

<span class="c"># cat -A（Linux）/ cat -e（macOS）</span>
<span class="nb">cat</span> <span class="nt">-A</span> input.txt   <span class="c"># CR が ^M として表示される</span>

<span class="c"># xxd で確認</span>
xxd input.txt | <span class="nb">grep</span> <span class="nt">-E</span> <span class="s2">"0d 0a|0a"</span>

</code></pre></div></div>

<p>改行コードは、file コマンドで確認するのが良いでしょう。</p>

<h4 id="crlf--lfdos2unix">CRLF → LF（dos2unix）</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># dos2unix（国内外問わず最も一般的）</span>
dos2unix input.txt                  <span class="c"># 上書き</span>
dos2unix input.txt output.txt       <span class="c"># 別ファイルに出力</span>
dos2unix <span class="k">*</span>.txt                      <span class="c"># 一括処理</span>

<span class="c"># sed（dos2unix が使えない環境）</span>
<span class="nb">sed</span> <span class="nt">-i</span> <span class="s1">'s/\r//'</span> input.txt           <span class="c"># Linux</span>
<span class="nb">sed</span> <span class="nt">-i</span> <span class="s1">''</span> <span class="s1">'s/\r//'</span> input.txt        <span class="c"># macOS</span>

<span class="c"># tr</span>
<span class="nb">tr</span> <span class="nt">-d</span> <span class="s1">'\r'</span> &lt; input.txt <span class="o">&gt;</span> output.txt

</code></pre></div></div>

<p>dos2unix , unix2dos コマンドには、BOMを制御するオプションがあります。<br />
改行コードとBOMを一括で変換するなら、BOMの制御が可能です。</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># dosテキストからUNIXテキストへ変換</span>
dos2unix  <span class="nt">--remove-bom</span> input.txt                  <span class="c"># 上書き</span>
dos2unix  <span class="nt">--remove-bom</span> input.txt output.txt       <span class="c"># 別ファイルに出力</span>
dos2unix  <span class="nt">--remove-bom</span> <span class="k">*</span>.txt                      <span class="c"># 一括処理</span>

</code></pre></div></div>

<h4 id="lf--crlfunix2dos">LF → CRLF（unix2dos）</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># unix2dos</span>
unix2dos input.txt
unix2dos input.txt output.txt

<span class="c"># sed</span>
<span class="nb">sed</span> <span class="nt">-i</span> <span class="s1">'s/$/\r/'</span> input.txt          <span class="c"># Linux</span>
<span class="nb">sed</span> <span class="nt">-i</span> <span class="s1">''</span> <span class="s1">'s/$/\r/'</span> input.txt       <span class="c"># macOS</span>

<span class="c"># awk</span>
<span class="nb">awk</span> <span class="s1">'{print $0"\r"}'</span> input.txt <span class="o">&gt;</span> output.txt

</code></pre></div></div>

<p>改行コードとBOMを一括で変換するなら、BOMの制御が可能です。</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># UNIXテキストからdosテキストへ変換</span>
unix2dos  <span class="nt">--add-bom</span> input.txt
unix2dos  <span class="nt">--add-bom</span> input.txt output.txt

</code></pre></div></div>

<h2 id="nkf-コマンドの使い方日本のみ">nkf コマンドの使い方（日本のみ）</h2>

<p>日本語環境では、世界標準コマンドよりも使い勝手の良い「nkf」というコマンドが提供されています。<br />
nkf コマンドは日本語の文字エンコーディングに特化した、文字エンコーディング・BOM・改行コードの確認と変換が可能なコマンドです。<br />
日本国内では nkf が標準ツールと言って良いでしょう。<br />
ただ、日本語文字エンコーディング専用なので海外では存在すら知られていません。<br />
nkf も UNIXシェル環境で提供されています。</p>

<p>基本的な使い方を以下に解説します。</p>

<h3 id="文字エンコーディングの変換-1">文字エンコーディングの変換</h3>

<h4 id="エンコーディングの確認-1">エンコーディングの確認</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nkf <span class="nt">--guess</span> input.txt
</code></pre></div></div>

<h4 id="shift_jis--utf-8-1">Shift_JIS → UTF-8</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nkf <span class="nt">-w</span> input.txt <span class="o">&gt;</span> output.txt        <span class="c"># -w = UTF-8出力</span>
nkf <span class="nt">-w</span> <span class="nt">--overwrite</span> input.txt         <span class="c"># 上書き（nkf限定の便利オプション）</span>

</code></pre></div></div>

<h4 id="utf-8--shift_jis-1">UTF-8 → Shift_JIS</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nkf <span class="nt">-s</span> input.txt <span class="o">&gt;</span> output.txt        <span class="c"># -s = Shift_JIS出力</span>
nkf <span class="nt">-s</span> <span class="nt">--overwrite</span> input.txt

</code></pre></div></div>

<h4 id="複数ファイルの一括変換bashzsh-1">複数ファイルの一括変換（bash/zsh）</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># nkf --overwrite で一括上書き</span>
nkf <span class="nt">-w</span> <span class="nt">--overwrite</span> <span class="k">*</span>.txt
</code></pre></div></div>

<h3 id="bom-の付加除去-1">BOM の付加・除去</h3>

<h4 id="bom-の確認-1">BOM の確認</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nkf <span class="nt">--guess</span> input.txt	<span class="c"># BOMがあれば (BOM) と表示する、無ければ表示しない</span>
</code></pre></div></div>

<h4 id="utf-8-bom-の除去-1">UTF-8 BOM の除去</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nkf <span class="nt">-w80</span> <span class="nt">--overwrite</span> input.txt
</code></pre></div></div>

<h4 id="utf-8-bom-の付加-1">UTF-8 BOM の付加</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nkf <span class="nt">-w8</span> <span class="nt">--overwrite</span> input.txt
</code></pre></div></div>

<h4 id="utf-16le-への変換bom付き-1">UTF-16LE への変換（BOM付き）</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nkf <span class="nt">-w16L</span> <span class="nt">--overwrite</span> input.txt
</code></pre></div></div>

<h4 id="utf-16le--utf-8bom除去を含む-1">UTF-16LE → UTF-8（BOM除去を含む）</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nkf <span class="nt">-w80</span> <span class="nt">--overwrite</span> input.txt
</code></pre></div></div>

<p>BOMを除去するときは、オプション末尾に 0 を付けます。<br />
末尾に 0 が無い場合はBOMを付加します。</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># BOMを除去する</span>
<span class="nt">-w80</span>  
<span class="nt">-w16L0</span>
<span class="nt">-w16B0</span>
<span class="c"># BOMを付加する</span>
<span class="nt">-w8</span>
<span class="nt">-w16L</span>
<span class="nt">-w16B</span>
</code></pre></div></div>

<h3 id="改行コードの変換-1">改行コードの変換</h3>

<h4 id="改行コードの確認-1">改行コードの確認</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nkf <span class="nt">--guess</span> input.txt	<span class="c"># Windows型改行コードならば (CRLF) と表示する。</span>
</code></pre></div></div>

<h4 id="crlf--lfdos2unixと同様">CRLF → LF（dos2unixと同様）</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nkf <span class="nt">-Lu</span> <span class="nt">--overwrite</span> input.txt       <span class="c"># -Lu = LF（Unix）改行</span>

</code></pre></div></div>

<h4 id="lf--crlfunix2dosと同様">LF → CRLF（unix2dosと同様）</h4>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nkf <span class="nt">-Lw</span> <span class="nt">--overwrite</span> input.txt       <span class="c"># -Lw = CRLF（Windows）改行</span>
</code></pre></div></div>

<h4 id="nkf-関連オプションまとめ">nkf 関連オプションまとめ</h4>

<p>nkf は、文字エンコーディングを自動推定する機能を持ち、対象テキストファイルの文字エンコーディングを特に指定しなくても、自動で識別してくれますが、その自動推定機能は完璧ではありません。<br />
そもそも「完璧な自動推定」など、どこにも存在しないので、100%自動推定機能に依存してはいけないのです。<br />
nkf には入力テキストファイルの文字エンコーディングを指定するオプションもあるので、対象文字エンコーディングが分かっているならば、オプションでそれを指定するべきでしょう。<br />
文字エンコーディングのオプションは以下のようになります。入力と出力は別々です。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">option</th>
      <th style="text-align: left">input/output</th>
      <th style="text-align: left">機能</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">-j</td>
      <td style="text-align: left">output</td>
      <td style="text-align: left">ISO-2022-JP で出力する。</td>
    </tr>
    <tr>
      <td style="text-align: left">-s</td>
      <td style="text-align: left">output</td>
      <td style="text-align: left">Shift_JIS で出力する。</td>
    </tr>
    <tr>
      <td style="text-align: left">-e</td>
      <td style="text-align: left">output</td>
      <td style="text-align: left">EUC-JP で出力する。</td>
    </tr>
    <tr>
      <td style="text-align: left">-w</td>
      <td style="text-align: left">output</td>
      <td style="text-align: left">UTF-8 で出力する。</td>
    </tr>
    <tr>
      <td style="text-align: left">-w8</td>
      <td style="text-align: left">output</td>
      <td style="text-align: left">UTF-8 で出力する。</td>
    </tr>
    <tr>
      <td style="text-align: left">-w16L</td>
      <td style="text-align: left">output</td>
      <td style="text-align: left">UTF-16LE で出力する。</td>
    </tr>
    <tr>
      <td style="text-align: left">-w16B</td>
      <td style="text-align: left">output</td>
      <td style="text-align: left">UTF-16BE で出力する。</td>
    </tr>
    <tr>
      <td style="text-align: left">-w32L</td>
      <td style="text-align: left">output</td>
      <td style="text-align: left">UTF-32LE で出力する。</td>
    </tr>
    <tr>
      <td style="text-align: left">-w32B</td>
      <td style="text-align: left">output</td>
      <td style="text-align: left">UTF-32BE で出力する。</td>
    </tr>
    <tr>
      <td style="text-align: left">-J</td>
      <td style="text-align: left">input</td>
      <td style="text-align: left">ISO-2022-JP で入力する。</td>
    </tr>
    <tr>
      <td style="text-align: left">-S</td>
      <td style="text-align: left">input</td>
      <td style="text-align: left">Shift_JIS で入力する。</td>
    </tr>
    <tr>
      <td style="text-align: left">-E</td>
      <td style="text-align: left">input</td>
      <td style="text-align: left">EUC-JP で入力する。</td>
    </tr>
    <tr>
      <td style="text-align: left">-W</td>
      <td style="text-align: left">input</td>
      <td style="text-align: left">UTF で入力する。</td>
    </tr>
    <tr>
      <td style="text-align: left">-W8</td>
      <td style="text-align: left">input</td>
      <td style="text-align: left">UTF-8 で入力する。</td>
    </tr>
    <tr>
      <td style="text-align: left">-W16L</td>
      <td style="text-align: left">input</td>
      <td style="text-align: left">UTF-16LE で入力する。</td>
    </tr>
    <tr>
      <td style="text-align: left">-W16B</td>
      <td style="text-align: left">input</td>
      <td style="text-align: left">UTF-16BE で入力する。</td>
    </tr>
    <tr>
      <td style="text-align: left">-W32L</td>
      <td style="text-align: left">input</td>
      <td style="text-align: left">UTF-32LE で入力する。</td>
    </tr>
    <tr>
      <td style="text-align: left">-W32B</td>
      <td style="text-align: left">input</td>
      <td style="text-align: left">UTF-32BE で入力する。</td>
    </tr>
  </tbody>
</table>

<p>大文字オプションは、入力テキストファイルの文字エンコーディングを指定し、<br />
小文字オプションは、出力テキストファイルの文字エンコーディングを指定します。<br />
文字エンコーディングの自動推定に任せるならば、入力テキストファイルの文字エンコーディングを指定する必要はありません。</p>

<p>文字エンコーディング・オプションの末尾に 0 を付けると『BOMを除去』することを意味します。末尾に 0 が無い場合は、BOMを付加します。（または「末尾に 0 が無い場合は、出力文字エンコーディングの標準設定に従います」）</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># BOMを除去する場合のオプション</span>
<span class="nt">-w80</span>
<span class="nt">-w16L0</span>
<span class="nt">-w16B0</span>
<span class="nt">-w32L0</span>
<span class="nt">-w32B0</span>
</code></pre></div></div>

<p>改行コードの変換は -L オプションで行います。<br />
オプションの二文字目(u w m)で改行コードの種類を指定します。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">option</th>
      <th style="text-align: left">改行コードの種類</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">-Lu</td>
      <td style="text-align: left">LF （UNIX規格の改行コード）</td>
    </tr>
    <tr>
      <td style="text-align: left">-Lw</td>
      <td style="text-align: left">CR・LF （Windows規格の改行コード）</td>
    </tr>
    <tr>
      <td style="text-align: left">-Lm</td>
      <td style="text-align: left">CR（旧Mac規格の改行コード）</td>
    </tr>
  </tbody>
</table>

<h2 id="コマンド操作まとめ">コマンド操作まとめ</h2>

<h3 id="推奨コマンド早見表">推奨コマンド早見表</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">操作</th>
      <th style="text-align: left">日本国内（推奨）</th>
      <th style="text-align: left">海外（推奨）</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">エンコーディング判別</td>
      <td style="text-align: left">nkf --guess / file -i</td>
      <td style="text-align: left">file -i</td>
    </tr>
    <tr>
      <td style="text-align: left">SJIS→UTF-8</td>
      <td style="text-align: left">nkf -w --overwrite</td>
      <td style="text-align: left">iconv -f SHIFT_JIS -t UTF-8</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-8→SJIS</td>
      <td style="text-align: left">nkf -s --overwrite</td>
      <td style="text-align: left">iconv -f UTF-8 -t SHIFT_JIS</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-8 BOM除去</td>
      <td style="text-align: left">nkf -w80 --overwrite</td>
      <td style="text-align: left">sed -i ‘s/^\xEF\xBB\xBF//’</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-8 BOM付加</td>
      <td style="text-align: left">nkf -w8 --overwrite</td>
      <td style="text-align: left">printf ‘\xEF\xBB\xBF’ | cat - file</td>
    </tr>
    <tr>
      <td style="text-align: left">CRLF→LF</td>
      <td style="text-align: left">dos2unix / nkf -Lu</td>
      <td style="text-align: left">dos2unix</td>
    </tr>
    <tr>
      <td style="text-align: left">LF→CRLF</td>
      <td style="text-align: left">unix2dos / nkf -Lw</td>
      <td style="text-align: left">unix2dos</td>
    </tr>
  </tbody>
</table>

<p><strong>日本国内と海外の最大の違い</strong>は nkf の有無です。<br />
国内では nkf が「エンコード変換・BOM操作・改行変換」を1ツールで担える万能ツールとして浸透していますが、海外では存在自体が知られていないことがほとんどで、iconv + dos2unix の組み合わせが事実上の標準です。<br />
macOS では Homebrew で両方インストールできます（brew install nkf dos2unix）。</p>

<p>日本語UNIXシェル環境ならば、nkf 一択と言えるでしょう。</p>

<h2 id="windows版の-nkf-コマンド">Windows版の nkf コマンド</h2>

<p>nkf は UNIXで提供されているコマンドですが、nkf に限り Windows版が提供されています。<br />
Windows版 nkf は Vector から配布されています。</p>

<p><a href="https://www.vector.co.jp/soft/dl/win95/util/se295331.html"><strong>nkf.exe nkf32.dll Windows用 ダウンロード</strong></a></p>

<p>圧縮ファイルを解凍し、exe を環境変数 PATH の通ったフォルダーにコピーすれば使用可能になります。</p>

<p>Windows版の nkf コマンドは Git Bash を使用するときに利用します。<br />
WSL の場合は、apt install nkf 等で Linux にインストールした Linux版 nkf を使用することになります。<br />
この点は、間違えないように注意してください。</p>

<h3 id="windows版-nkf-の問題点">Windows版 nkf の問題点</h3>

<p>Windows版 nkf は PowerShell や cmd でも使用することができます。<br />
しかし、その仕様には少し問題があります。</p>

<p>nkf は UNIXシェル（<code class="language-plaintext highlighter-rouge">bash , zsh</code> など）に合わせて開発されています。<br />
Windowsの PowerShell や cmd の仕様に合わせていません。<br />
nkf の場合は、<strong>二つの問題点</strong>があります。</p>

<p><strong>問題の一つ</strong>はワイルドカード展開です。<br />
UNIXシェルでは、コマンドパラメータのファイル名指定で使用されるワイルドカード（<code class="language-plaintext highlighter-rouge">*</code> :アスタリスク）は、まずシェル側で展開されコマンドに対しては検索されたファイル名のリストで引き渡されます。<br />
例えばカレントディレクトリに以下のファイルがあるとします。</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">ls</span> <span class="k">*</span>
text1.txt  text2.txt  text3.txt
</code></pre></div></div>

<p>この状況で、以下の様にコマンド com にワイルドカードを指定するとします。（com は仮のコマンドです）</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>com <span class="k">*</span>
</code></pre></div></div>

<p>すると、UNIXシェルは <code class="language-plaintext highlighter-rouge">*</code> を検索してファイル名のリストにしてから、コマンドに引き渡します。</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>com text1.txt text2.txt text3.txt
</code></pre></div></div>

<p>つまり、UNIX環境では、シェル側がワイルドカードに該当するファイル名を検索してくれるので、コマンド側ではワイルドカードを展開する必要が無いのです。<br />
UNIX系のコマンドにはワイルドカードを展開する機能が備わっていません。</p>

<p>nkf コマンドも同様で、Windows 環境で <code class="language-plaintext highlighter-rouge">nkf *</code>  とワイルドカードを指定しても該当ファイルを検索することができません。<br />
UNIXシェルで nkf を使用するとワイルドカード展開をしてくれますが、PowerShell と cmd ではワイルドカード展開をしてくれません。<br />
これはUNIXとWindowsのシェル仕様の違いによるものです。</p>

<p>つまり、Windows環境（PowerShell と cmd）では nkf はワイルドカードを使用することができないのです。</p>

<h4 id="powershell-固有の問題">PowerShell 固有の問題</h4>

<p>nkf を含めて UNIX系コマンドは、出力結果を標準出力に出力する仕様のコマンドが多いです。<br />
nkf もUNIX標準的な使い方では、以下の様に標準出力に出力します。対象ファイルに上書きしたりはしません。</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Shift_JIS から UTF-8のBOM付き で標準出力に出力する</span>
nkf <span class="nt">-S</span> <span class="nt">-w8</span> input.txt
</code></pre></div></div>

<p>対象ファイルに上書きするときは、–overwrite オプションを指定します。</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nkf <span class="nt">-S</span> <span class="nt">-w8</span> <span class="nt">--overwrite</span> input.txt
</code></pre></div></div>

<p>標準的使い方では、上書きしないで標準出力に出力するのは、UNIX文化では一つのコマンドはできるだけ単純な機能だけを提供し、複雑な処理をするときはパイプラインを使用して、別のコマンドと組み合わせて使用するのがUNIXの作法になっているからです。</p>

<p>上書きするときは、上書き用のオプションを指定することが多いです。</p>

<p>UNIXのパイプラインの仕様はバイト配列をそのまま送る仕様です。</p>

<p>ここで<strong>二つ目の問題</strong>があります。<br />
PowerShellではパイプラインの機構にオブジェクトパイプラインという独自の実装があります。<br />
PowerShellのコマンドレットでは、標準出力への出力文字列は .NET の System.String 型のコレクションにして出力されます。</p>

<p>PowerShell 上で、Windows版の nkf を使用して標準出力の結果を、パイプラインで別のコマンドの標準入力に繋いでも、テキストを正常に受け取れない場合があります。<br />
ここで注意が必要なのは、<strong>PowerShell 7.4 以降はこのパイプラインの仕様に改善があり、nkf も正常に稼働することがあります</strong>。<br />
<strong>PowerShell 7.3 以前や Windows PowerShell では、nkf のパイプライン出力は文字化けや、意図しない文字エンコーディングでの出力という、不本意な結果になる場合があります</strong>。<br />
PowerShell は進化を続けていますが、パイプラインの問題が抜本的に解決したわけではありません。<br />
PowerShell で nkf を使用する変換処理を行うときは、–overwrite オプションを使用するようにした方が堅実です。</p>

<h2 id="windowsではunix標準コマンドは使い難い">WindowsではUNIX標準コマンドは使い難い</h2>

<p>長々と解説してきましたが、これまでの説明を見て分かるように、Windows環境では「文字エンコーディングやBOMの有無・改行コードの確認」と、「それぞれの変換」操作は、いちいちUNIXシェルを導入して操作しなければならないので、非常に面倒です。<br />
文字エンコーディングとBOM変換の方は、PowerShell のコマンドレットで操作できますが、現状の確認ができません。<br />
文字エンコーディングの自動識別機能も存在しません。</p>

<p>私が、mfsr-mfprobe コマンドを作成したのも、この操作の面倒臭い問題を解消したかったからです。</p>

<p><a href="https://snow-stack.net/tool_rmsmf_guide/">rmsmf-txprobe &amp; mfsr-mfprobe 使い方の分かりやすい解説</a></p>

<p>今回は、Windows 上に UNIXシェルを導入することにより、文字エンコーディングとBOMと改行コードの確認と変換を行う方法の解説をしました。</p>

<p>次回は、PowerShell による文字エンコーディングとBOMの操作方法を解説したいと思っています。<br />
但し、既に解説したように、PowerShell には 文字エンコーディングとBOM を確認する機能はありません。その点は先に説明しておきます。</p>

<p>PowerShell の解説は、いつ投稿するか分かりませんが、ゆるゆると原稿を書いていきたいと思います。</p>

<p>では、また。</p>]]></content><author><name>snow-stack</name></author><category term="文字エンコーディング" /><category term="Character Encoding" /><category term="改行コード" /><category term="BOM" /><category term="file" /><category term="iconv" /><category term="nkf" /><category term="dos2unix" /><category term="unix2dos" /><category term="WSL" /><category term="Git Bash" /><category term="Windows ツール" /><summary type="html"><![CDATA[前回の記事で、触れた「Windows 固有の文字エンコーディング問題」には、以下の問題があります。]]></summary></entry><entry><title type="html">Windows 11 環境でのテキストファイル新規作成時のデフォルトエンコーディング検証の総まとめ</title><link href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/18/windows11-encoding-blog.html" rel="alternate" type="text/html" title="Windows 11 環境でのテキストファイル新規作成時のデフォルトエンコーディング検証の総まとめ" /><published>2026-02-18T00:00:00+00:00</published><updated>2026-02-18T00:00:00+00:00</updated><id>https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/18/windows11-encoding-blog</id><content type="html" xml:base="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/18/windows11-encoding-blog.html"><![CDATA[<h2 id="はじめに">はじめに</h2>

<p>これまで、以下の二つの記事で「Windows環境におけるテキストファイルの文字エンコーディングとBOMの扱い」について、検証確認してきました。</p>

<p><a href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/14/encoding-report.html">Windows 11 標準アプリ 文字エンコーディング対応状況まとめ</a></p>

<p><a href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/16/windows-console-encoding-report.html">Windowsコンソールの文字エンコーディング対応状況を検証する</a></p>

<p>前の記事は、メモ帳など主要アプリの対応状況を、
後の記事は、コンソールの対応状況を検証した結果報告です。</p>

<p>今回、これに加えて Visual Studio と SSMS(SQL Server Management Studio) についても検証しました。</p>

<p>この記事では、過去の検証結果と、Visual Studio と SSMS(SQL Server Management Studio) の「テキストファイルの新規作成」を行ったときの文字エンコーディングとBOMの有無の状態を、まとめました。</p>

<p>主に、それぞれのアプリやツールのデフォルト設定で新規作成した場合のレポートです。</p>

<p>ここから、Microsoftの意図と、Windows環境のテキスト問題が明確になってきます。</p>

<p>まず、検証結果のまとめを、ご覧下さい。</p>

<hr />

<h2 id="検証結果一覧">検証結果一覧</h2>

<table>
  <thead>
    <tr>
      <th style="text-align: left">ツール / 操作</th>
      <th style="text-align: left">デフォルトエンコーディング</th>
      <th style="text-align: center">BOM</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">メモ帳</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">なし</td>
    </tr>
    <tr>
      <td style="text-align: left">cmd (<code class="language-plaintext highlighter-rouge">echo &gt;</code>)</td>
      <td style="text-align: left">Shift_JIS</td>
      <td style="text-align: center">—</td>
    </tr>
    <tr>
      <td style="text-align: left">Windows PowerShell 5.1 (<code class="language-plaintext highlighter-rouge">&gt;</code>)</td>
      <td style="text-align: left">UTF-16LE</td>
      <td style="text-align: center">あり</td>
    </tr>
    <tr>
      <td style="text-align: left">Windows PowerShell 5.1 (<code class="language-plaintext highlighter-rouge">Set-Content</code>)</td>
      <td style="text-align: left">Shift_JIS</td>
      <td style="text-align: center">—</td>
    </tr>
    <tr>
      <td style="text-align: left">PowerShell 7.x (<code class="language-plaintext highlighter-rouge">&gt;</code>)</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">なし</td>
    </tr>
    <tr>
      <td style="text-align: left">PowerShell 7.x (<code class="language-plaintext highlighter-rouge">Set-Content</code>)</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">なし</td>
    </tr>
    <tr>
      <td style="text-align: left">VS Code</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">なし</td>
    </tr>
    <tr>
      <td style="text-align: left">Excel CSV保存</td>
      <td style="text-align: left">Shift_JIS（UTF-8 BOM付きも選択可）</td>
      <td style="text-align: center">※後述</td>
    </tr>
    <tr>
      <td style="text-align: left">Visual Studio 2026（C# / VB.NET / C++）</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">あり</td>
    </tr>
    <tr>
      <td style="text-align: left">Visual Studio 2026（json / js / ts）</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">なし</td>
    </tr>
    <tr>
      <td style="text-align: left">Visual Studio 2026（xml）</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">あり</td>
    </tr>
    <tr>
      <td style="text-align: left">SSMS（TEXT / SQL / js）</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">なし</td>
    </tr>
    <tr>
      <td style="text-align: left">SSMS（XML）</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">あり</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="各ツールの詳細">各ツールの詳細</h2>

<h3 id="メモ帳">メモ帳</h3>

<ul>
  <li><strong>デフォルト:</strong> UTF-8（BOM無し）</li>
  <li>保存ダイアログから他のエンコーディングも選択可能。以前のバージョンではUTF-8 BOM付きやANSI（Shift_JIS）がデフォルトだったが、現在のWindows 11ではBOM無しUTF-8に変更されている。</li>
</ul>

<h3 id="コマンドプロンプトcmd">コマンドプロンプト（cmd）</h3>

<pre><code class="language-cmd">echo "日本語です" &gt; text.txt
</code></pre>

<ul>
  <li><strong>デフォルト:</strong> Shift_JIS</li>
  <li>システムロケールのコードページ（日本語環境では CP932 = Shift_JIS）に従う。</li>
</ul>

<h3 id="windows-powershell-51">Windows PowerShell 5.1</h3>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># リダイレクト演算子</span><span class="w">
</span><span class="s2">"日本語です"</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="n">text.txt</span><span class="w">        </span><span class="c"># → UTF-16LE（BOM付き）</span><span class="w">

</span><span class="c"># Set-Content</span><span class="w">
</span><span class="s2">"日本語です"</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">Set-Content</span><span class="w"> </span><span class="nx">text.txt</span><span class="w">   </span><span class="c"># → Shift_JIS</span><span class="w">
</span></code></pre></div></div>

<ul>
  <li>リダイレクト演算子（<code class="language-plaintext highlighter-rouge">&gt;</code>）と <code class="language-plaintext highlighter-rouge">Set-Content</code> で<strong>エンコーディングが異なる</strong>点に注意。</li>
  <li><code class="language-plaintext highlighter-rouge">Set-Content</code> は <code class="language-plaintext highlighter-rouge">-Encoding</code> パラメータで明示的に指定できる。</li>
</ul>

<h3 id="powershell-7x">PowerShell 7.x</h3>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># リダイレクト演算子</span><span class="w">
</span><span class="s2">"日本語です"</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="n">text.txt</span><span class="w">        </span><span class="c"># → UTF-8（BOM無し）</span><span class="w">

</span><span class="c"># Set-Content</span><span class="w">
</span><span class="s2">"日本語です"</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">Set-Content</span><span class="w"> </span><span class="nx">text.txt</span><span class="w">   </span><span class="c"># → UTF-8（BOM無し）</span><span class="w">
</span></code></pre></div></div>

<ul>
  <li>PowerShell 7.x ではどちらの方法でも<strong>UTF-8（BOM無し）に統一</strong>された。</li>
  <li>PowerShell 5.1 から移行する際は、エンコーディングの挙動変化に注意が必要。</li>
</ul>

<h3 id="vs-code">VS Code</h3>

<ul>
  <li><strong>デフォルト:</strong> UTF-8（BOM無し）</li>
  <li>ステータスバーからエンコーディングを変更可能。設定で <code class="language-plaintext highlighter-rouge">files.encoding</code> を変更すればデフォルトも変えられる。</li>
</ul>

<h3 id="excel-csv保存">Excel CSV保存</h3>

<ul>
  <li><strong>通常保存:</strong> Shift_JIS</li>
  <li><strong>「UTF-8（カンマ区切り）」で保存:</strong> UTF-8（BOM付き）</li>
  <li>UTF-8（BOM無し）で保存する選択肢は<strong>用意されていない</strong>。</li>
</ul>

<h3 id="visual-studio-2026">Visual Studio 2026</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">ファイル種別</th>
      <th style="text-align: left">エンコーディング</th>
      <th style="text-align: center">BOM</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">C#（.cs）</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">あり</td>
    </tr>
    <tr>
      <td style="text-align: left">VB.NET（.vb）</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">あり</td>
    </tr>
    <tr>
      <td style="text-align: left">C++（.cpp / .h）</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">あり</td>
    </tr>
    <tr>
      <td style="text-align: left">json</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">なし</td>
    </tr>
    <tr>
      <td style="text-align: left">xml</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">あり</td>
    </tr>
    <tr>
      <td style="text-align: left">JavaScript（.js）</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">なし</td>
    </tr>
    <tr>
      <td style="text-align: left">TypeScript（.ts）</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">なし</td>
    </tr>
  </tbody>
</table>

<blockquote>
  <p><strong>注意:</strong> VB.NET の <code class="language-plaintext highlighter-rouge">Program.vb</code> だけが、なぜか UTF-8（BOM無し）で生成される。テンプレートの不整合またはバグの可能性がある。</p>
</blockquote>

<h3 id="ssmssql-server-management-studio">SSMS（SQL Server Management Studio）</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">ファイル種別</th>
      <th style="text-align: left">エンコーディング</th>
      <th style="text-align: center">BOM</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">TEXT（.txt）</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">なし</td>
    </tr>
    <tr>
      <td style="text-align: left">SQL（.sql）</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">なし</td>
    </tr>
    <tr>
      <td style="text-align: left">XML（.xml）</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">あり</td>
    </tr>
    <tr>
      <td style="text-align: left">JavaScript（.js）</td>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: center">なし</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="傾向の整理">傾向の整理</h2>

<p>検証結果から、以下の傾向が読み取れます。</p>

<h3 id="モダンなツール--utf-8bom無し">モダンなツール → UTF-8（BOM無し）</h3>

<p>メモ帳、PowerShell 7.x、VS Code など、比較的新しいツールはUTF-8（BOM無し）をデフォルトとしています。Web標準やLinux環境との親和性を重視した流れです。</p>

<h3 id="レガシー系--shift_jis--utf-16le">レガシー系 → Shift_JIS / UTF-16LE</h3>

<p>コマンドプロンプトや Windows PowerShell 5.1 は、従来のWindowsの文字コード体系を引き継いでいます。既存のバッチファイルやスクリプトとの互換性が理由と考えられます。</p>

<h3 id="ソースコードc-vbnet-c-utf-8-bom付き">ソースコード（C#, VB.NET, C++）→ UTF-8 BOM付き</h3>

<p>Visual Studio はコンパイラがソースファイルのエンコーディングを確実に認識できるよう、BOMを付与しています。</p>

<h3 id="web系ファイルjson-js-ts-utf-8bom無し">Web系ファイル（json, js, ts）→ UTF-8（BOM無し）</h3>

<p>Web の世界ではBOM無しが標準のため、Visual Studio・SSMS ともにWeb系ファイルはBOM無しで生成されます。</p>

<h3 id="xml--utf-8-bom付き">XML → UTF-8 BOM付き</h3>

<p>Visual Studio、SSMS のいずれにおいても XML は BOM付きです。XML宣言の <code class="language-plaintext highlighter-rouge">encoding</code> 属性との整合性を意識した実装と考えられます。</p>

<hr />

<h2 id="検証結果まとめ">検証結果まとめ</h2>

<p>Windows 11 環境でも、ツールやファイル形式によってデフォルトのエンコーディングはバラバラです。特に以下のポイントは押さえておきたいところです。</p>

<ol>
  <li><strong>Windows PowerShell 5.1 のリダイレクト（<code class="language-plaintext highlighter-rouge">&gt;</code>）は UTF-16LE（BOM付き）</strong> — 他のツールで開くと文字化けの原因になりやすい</li>
  <li><strong>PowerShell 5.1 では <code class="language-plaintext highlighter-rouge">&gt;</code> と <code class="language-plaintext highlighter-rouge">Set-Content</code> でエンコーディングが異なる</strong> — 同じPowerShellでも出力方法で結果が変わる</li>
  <li><strong>Excel CSV は UTF-8（BOM無し）で保存できない</strong> — 他システム連携時に注意</li>
  <li><strong>Visual Studio のソースコードは BOM付き、Web系ファイルは BOM無し</strong> — 混在するプロジェクトでは意識が必要</li>
</ol>

<p>チームでの開発では <code class="language-plaintext highlighter-rouge">.editorconfig</code> や各ツールの設定でエンコーディングを統一しておくと、トラブルを未然に防げます。</p>

<hr />

<h2 id="所感">所感</h2>

<p>以前書いた <a href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/06/Windows-%E5%9B%BA%E6%9C%89%E3%81%AE%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E5%95%8F%E9%A1%8C.html">Windows 固有の文字エンコーディング問題</a> という記事の中で、私は「MicrosoftがUNIX標準に合わせるのは、時間の問題」と言いました。</p>

<p>今回、Windows環境の主要ソフトウェア全ての文字エンコーディングとBOMの有無を確認して、得られた認識は、「Microsoftは既にBOM無しUTF-8のテキストに軸足を移し始めている」ということです。</p>

<p>改行コードは、全てのツールとアプリにおいて CR-LF を堅持しています。</p>

<p>しかし、メモ帳・VS Code・PowerShell7.x・SSMS においては、既にBOM無しUTF-8が主流となっています。</p>

<p>それに対し、レガシーデータの多い Excel が 今でも Shift_JIS をメインとし、補助的に BOM付きUTF-8 を採用しているのは、理解できるとして、Visual Studio 2026 が今でも C#・C++ においても BOM付きUTF-8 を採用しているのは、やや意外でした。</p>

<p>開発環境は、全てBOM無しUTF-8になるのかと思いましたが、Visual Studio はExcel同様にレガシーデータが多いので、簡単にBOM無しUTF-8を採用できないのが、理解できます。</p>

<h3 id="ai-でも文字化けを解消できない">AI でも文字化けを解消できない</h3>

<p>　Visual Studio 2026 に統合された GitHub Copilot Agent を使用して、AI Agent にコーディングをやらせてみると、「BOM無しUTF-8のソースファイルを作成しようとして、AIがMAUIコンパイラを呼び出すと、コンパイラが Shift_JIS と誤解してしまい、MAUI画面が文字化けする」という現象が頻繁に起きます。
例えば PowerShell 7.x のコマンドレットで新規ファイルを作成すると、「BOM無しUTF-8」のテキストファイルを作成しますが、Visual Studio 環境では「BOM無しはShift_JIS」「BOM付きはUTF-8」と解釈するので、PowerShellコマンドレットで「BOM無しUTF-8」を作成すると、Shift_JISと解釈されてその後の編集で文字化けするのです。PowerShell 7.x と Visual Studio の間で、UTF-8ファイルの解釈が統一されていないことで起きる不具合です。
なお、PowerShell 7.x のリダイレクト演算子（&gt;）や単純な <code class="language-plaintext highlighter-rouge">Out-File</code> , <code class="language-plaintext highlighter-rouge">Set-Content</code> ではBOM付きUTF-8を作成できません。<code class="language-plaintext highlighter-rouge">-Encoding</code> 指定で <code class="language-plaintext highlighter-rouge">Set-Content -Encoding utf8BOM</code> ならば作成可能です。</p>

<p>この現象が起きると AIエージェントは、自力では文字化けを解消できません。何度も失敗して最後は人間に助けを求めます。(私の観測範囲ではMAUIコンパイラがBOM無しUTF-8に対応していません、他にもこのような問題があると思われます)</p>

<p>AIエージェント は素晴らしいコーディング能力を発揮しますが、独力では文字化け一つ解決できないのです。</p>

<p>世間ではあまり意識されませんが AIエージェント の内部では、コンパイラなど AI (LLM)ではない従来型のソフトウェアが呼び出されて使用されています。</p>

<p>AIエージェント は、LLMと従来型アルゴリズムの組み合わせでできているので、Windows 環境のように文字エンコーディング問題が、従来型アルゴリズムの段階で解決していないと、 AIエージェント でも問題を解決できません。</p>

<p>文字エンコーディング問題などは、現状では人間が手動で解決しなければならない問題の一つです。
 AIエージェント が文字化けで停止することを回避するには、あらかじめ人間が文字化け問題を解決しておかなければならないのです。(ルンバも、部屋を片付けておかなければ掃除ができないのと同じです)</p>

<p>Visual Studio 2026 に統合された GitHub Copilot Agent が文字化けに悩み人間に助けを求める状況は、 AIエージェント の構造をよく表している現象だと思います。</p>

<h3 id="文字化け問題は深刻化している">文字化け問題は深刻化している</h3>

<p>私は、2020年に <a href="https://snow-stack.net/tool_rmsmf_guide/">rmsmf</a> を作ったとき、「文字エンコーディング問題など、3年もすれば解消するだろう」と思っていました。だから rmsmf のアップデートは一時停滞していました。</p>

<p>しかし、現在のWindows環境を検証してみると、昔より文字エンコーディングとBOMのトラブルは多くなっているように見えます。</p>

<p>昔の文字エンコーディング問題は、「Shift_JIS か UTF-8 か UTF-16LE」の問題が主で、解決策も「ファイル先頭にBOMを付ける」ことで済んでいました。</p>

<p>しかし、MicrosoftがWSLを導入して以降、新たな問題が生じています。</p>

<p>それは「BOM無しUTF-8」の問題です。当初MicrosoftはUTF-8を「BOM付き」で導入することで、Shift_JISとの混在による混乱を回避していました。</p>

<p>しかし、WSLによりLinux環境とテキストファイルを共有するようになってから、「BOM無しUTF-8」のテキストをWindows環境に受け入れなければならなくなりました。</p>

<p>結果として、それまでテキストファイルの先頭のBOMだけ確認していれば、複数文字エンコーディングの共存ができていたのに、「BOM無しUTF-8」の存在により「BOMによる文字エンコーディングの判別」ができなくなってしまいました。</p>

<p>しかも、テキストファイルの文字エンコーディングを判定する手段は、Windowsユーザーには提供されていません。</p>

<p>メモ帳 や VS Code は一応、「BOM無しUTF-8」を自動判定してくれます。しかし、一般ユーザーはそれが「BOM付きUTF-8」なのか「BOM無しUTF-8」なのかを区別できません。</p>

<p>Visual Studio の検証結果を見れば分かるように、Windows環境の C# や C++ や VB.NET・XML などのソースファイルは、今でも「BOM付きUTF-8」が基本になっています。</p>

<p>Excel CSV や VBA なども Shift_JIS をデフォルトとしながら「BOM付きUTF-8」が基本になっています。</p>

<p>一方、メモ帳 と VS Code と PowerShell 7.x は、「BOM無しUTF-8」が基本になっており、PowerShell 7.x では単純なリダイレクトなどでは「BOM付きUTF-8」が作成できません。<code class="language-plaintext highlighter-rouge">-Encoding utf8BOM</code> 指定が必要です。</p>

<p>Windows PowerShell 5.1 もOSの深部との結びつきが強く、まだ現役で標準装備されています。
Windows PowerShell 5.1 は、「BOM付きUTF-16LE」テキストが標準の上に、コマンドレットによって「Shift_JIS」テキストと混在しており、日本語文字エンコーディングが統一されていません。</p>

<p>つまり、Windows環境では、テキストファイルの「Shift_JIS」「BOM付きUTF-8」「BOM無しUTF-8」「BOM付きUTF-16LE」が混在していながら、それぞれを区別する手段が提供されていないのです。</p>

<p>「どうして、いまさら文字エンコーディング対応など、調べているのか」と言えば、WSL導入以降のWindows環境において、BOMを中心とした文字エンコーディングの混乱が拡大しているからです。</p>

<h3 id="改行コードの問題も無視できない">改行コードの問題も無視できない</h3>

<p>Microsoftは GitHubを買収し、積極的に Windows環境に GitHub のアプリケーションを受け入れています。</p>

<p>その最たるものが、GitHub Copilot Agent だと思います。</p>

<p>GitHub は Git をベースにした Linux と OSS 文化圏のサービスです。そのシステムは全て UNIX 標準で統一されています。</p>

<p>Linux OS と UNIXのmacOS のテキスト改行コードは LF で統一されていますが、Windows のテキスト改行コードは、CR-LF で統一されており、GitHub へソースを Commit-Push するとき変換する必要があります。</p>

<p>今のWindowsテキストの改行コードは CR-LF のまま変更される様子は無いですが、これまでの文字エンコーディング対応の変化を見る限り、改行コードが CR-LF から LF へ変更される可能性を否定できません。</p>

<p>現状で CR-LF の CR に存在価値があるとは思えないからです。</p>

<h3 id="残りの牙城の寿命は少ない">残りの牙城の寿命は少ない</h3>

<p>UNIX標準テキストが、「BOM無しUTF-8」ならば、古いテキスト「Shift_JIS」「BOM付きUTF-8」「BOM付きUTF-16LE」を支えるアプリケーションとレガシーデータの牙城は、Excel, Visual Studio, Windows PowerShell 5.1 ということになります。</p>

<p>Visual Studio は、過去に Shift_JIS を標準としていた時代があり、現在の「BOM付きUTF-8」標準を廃して「BOM無しUTF-8」を標準とするのも時間の問題でしょう。</p>

<p>PowerShell は 7.x で既に「BOM無しUTF-8」を標準としており、Windowsのシステムも Windows PowerShell 5.1への依存部分を徐々に PowerShell 7.x へ移行していて、旧 5.1 が廃止されることは約束された未来です。</p>

<p>レガシーデータの牙城として唯一終わりが見えないのは、Excel CSV と VBA です。</p>

<p>Microsoft は Word においては、テキストインポートのときに、ユーザーに文字エンコーディングを選択させる形で、複数文字エンコーディングに対応しています。</p>

<p>しかし、何故か Excel では依然として文字エンコーディングの判別を、テキスト先頭の BOM に依存しています。
また、デフォルトでの CSVファイルへの保存も Shift_JIS のままです。</p>

<p>Excel 以外の全てのアプリとツールは、明らかに「BOM無しUTF-8」への移行に向かっているのですが、Excel だけはその兆候が見えません。</p>

<h3 id="bomが消えるのはいつなのか">BOMが消えるのはいつなのか</h3>

<p>Windows環境において、そのテキストファイルの規格が「BOM無しUTF-8」へ完全に切り替わるまで、まだまだ時間がかかると思われます。</p>

<p>Visual Studio が、そのソースファイルを全て「BOM無しUTF-8」へ完全に切り替えるのは、あと二・三世代ぐらい後のバージョンになると思っています。少なくとも現在の 2026 ではオプション設定などで「BOM無しUTF-8」を標準とする機能がやっと追加された段階です。</p>

<p>Windows PowerShell 5.1 が完全に廃止され、PowerShell 7 以降に統合されるのは、10年は先の話になると思います。(関係ないけどコントロールパネルはいつ無くなるのでしょうね？)</p>

<p>Excel CSV と VBA については、先が全く見えません。Excel による CSV出力や、CSV の Excel による閲覧は、本当に一般ユーザーの中でよく使用される機能です。
Excel VBA も利用している人々が多すぎて、消滅することが想像し難い状況です。(モダンExcelはどこへ行った？)</p>

<p>Excel 自身が Shift_JIS の CSV を今でも量産して、文字エンコーディング問題を拡大しています。</p>

<p>将来の Windows環境が「BOM無しUTF-8」へ切り替わることは、ほぼ確実なのですが、今後10年以上は Windows環境の文字エンコーディングとBOMの問題に、付き合わなければならないと思われます。</p>

<p>また、先に説明した改行コードの問題も未解決であることもお忘れなく。</p>

<h3 id="まだまだ終わらない文字エンコーディング問題の後始末">まだまだ終わらない文字エンコーディング問題の後始末</h3>

<p>これまで報告してきたように、Windows環境では2000年代に一度、Shift_JISからUTF-16LEへ移行し、その後さらにBOM付きUTF-8へ移行したことがあります。</p>

<p>その後、2010年代後期に一部の機能が「BOM付きUTF-8」から「BOM無しUTF-8」へ移行しています。この移行はこれまで報告してきたように、まだ「移行途中」であり、古いShift_JIS・BOM付きUTF-8とUTF-16LEが一部のアプリで併存している状況です。</p>

<p>結果として、Windows環境には Shift_JIS・BOM付きUTF-16LE・BOM付きUTF-8・BOM無しUTF-8 のテキストが混在する状況になっています。</p>

<p>BOM付きUTF-8・BOM無しUTF-8 が混在しているので、BOMによる識別もできません。</p>

<p>Shift_JISとBOM付きUTFだけが混在していた昔より、文字エンコーディングの識別が困難になっています。</p>

<p>しかも、文字エンコーディングの識別はユーザーの自己責任です。</p>

<p>このような文字エンコーディング周りの状況が悪化しているのを受けて、最近私は mfprobe-mfsr というツールを開発してリリースしました。</p>

<p>これは、2020年に開発して公開していた rmsmf という .NET Framework 4.8用の ツールを改良し .NET10 Native AOT で再構築して提供したものです。
元々は、文字列置換ツールだったのですが、Windows環境特有の文字エンコーディング問題を無視しては置換処理すらできないことから、文字エンコーディング判別変換機能とBOM確認追加削除機能と改行コードの変換機能を有しています。</p>

<p>Windows環境で、手軽に複数ファイルを対象に文字エンコーディングやBOMの有無や改行コードの種類を確認・変換できるツールが見当たらなかったので、自分で開発したツールです。</p>

<p>もし良ければ、文字エンコーディング問題への対処にご利用ください。</p>

<p>以下のページで公開しています。</p>

<p><a href="https://snow-stack.net/tool_rmsmf_guide/">rmsmf-txprobe &amp; mfsr-mfprobe 使い方の分かりやすい解説</a></p>

<p>MITライセンスで公開しています。オープンソースのフリーソフトです。</p>

<hr />

<h2 id="検証環境">検証環境</h2>

<ul>
  <li><strong>OS:</strong> Windows 11 Pro 25H2</li>
  <li><strong>PowerShell:</strong> Windows PowerShell 5.1 / PowerShell 7.5.4</li>
  <li><strong>Visual Studio:</strong> Visual Studio 2026</li>
  <li><strong>VS Code:</strong> 1.109.4</li>
  <li><strong>SSMS:</strong> SQL Server Management Studio 22.3</li>
  <li><strong>Excel:</strong> Microsoft Office 2024</li>
</ul>

<hr />

<p><em>最終更新: 2026年2月</em></p>]]></content><author><name>snow-stack</name></author><category term="文字エンコーディング" /><category term="Character Encoding" /><category term="Shift_JIS" /><category term="UTF-8" /><category term="UTF-16" /><category term="BOM" /><summary type="html"><![CDATA[はじめに]]></summary></entry><entry><title type="html">Windowsコンソールの文字エンコーディング対応状況を検証する</title><link href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/16/windows-console-encoding-report.html" rel="alternate" type="text/html" title="Windowsコンソールの文字エンコーディング対応状況を検証する" /><published>2026-02-16T00:00:00+00:00</published><updated>2026-02-16T00:00:00+00:00</updated><id>https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/16/windows-console-encoding-report</id><content type="html" xml:base="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/16/windows-console-encoding-report.html"><![CDATA[<h2 id="はじめに">はじめに</h2>

<p>Windowsには複数のコンソール環境が存在し、それぞれ文字エンコーディングの扱いが異なります。特に日本語環境では、Shift_JIS（cp932）、UTF-8、UTF-16 など複数のエンコーディングが混在するため、ファイルの読み書き時に文字化けが発生するケースが少なくありません。</p>

<p>本記事では、以下の3つのコンソール環境について、各種文字エンコーディングのファイルを正しく読み書きできるかを検証しました。</p>

<ul>
  <li><strong>コマンドプロンプト（cmd.exe）</strong></li>
  <li><strong>Windows PowerShell 5.1</strong></li>
  <li><strong>PowerShell 7.5.4</strong></li>
</ul>

<p>検証は「デフォルト設定でのファイル読み込み・リダイレクト」と「エンコーディングを明示的に指定した場合の出力」の2つの観点で行っています。</p>

<h3 id="検証環境">検証環境</h3>

<table>
  <thead>
    <tr>
      <th>項目</th>
      <th>バージョン</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>OS</td>
      <td>Windows 11 25H2</td>
    </tr>
    <tr>
      <td>コマンドプロンプト</td>
      <td>cmd.exe（cp932）</td>
    </tr>
    <tr>
      <td>Windows PowerShell</td>
      <td>5.1</td>
    </tr>
    <tr>
      <td>PowerShell</td>
      <td>7.5.4</td>
    </tr>
  </tbody>
</table>

<h3 id="テストデータ">テストデータ</h3>

<p>ASCII文字・カタカナ・漢字を含む複数行の日本語テキストファイル（text1.txt）を使用しました。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>TESTストリングaaa日本語国債発行
TESTストリングbbb日本語
...（以下、同様の形式で計18行）
</code></pre></div></div>

<p>このテストファイルを13種類の文字エンコーディングで用意し、それぞれの読み込み・出力結果を確認しています。</p>

<hr />

<h2 id="検証1デフォルト設定でのファイル読み込みとリダイレクト">検証1：デフォルト設定でのファイル読み込みとリダイレクト</h2>

<p>各コンソールのデフォルト設定で、異なるエンコーディングのテキストファイルをリダイレクトし、出力ファイルが正しく読めるかを検証しました。</p>

<h3 id="検証コマンド">検証コマンド</h3>

<p><strong>cmd.exe：</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>type text1.txt &gt; workc.txt
</code></pre></div></div>

<p><strong>Windows PowerShell 5.1 / PowerShell 7.5.4：</strong></p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Get-Content</span><span class="w"> </span><span class="nt">-Path</span><span class="w"> </span><span class="s2">"text1.txt"</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="nx">work.txt</span><span class="w">
</span><span class="n">Get-Content</span><span class="w"> </span><span class="nt">-Path</span><span class="w"> </span><span class="s2">"text1.txt"</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">Set-Content</span><span class="w"> </span><span class="nx">set.txt</span><span class="w">
</span><span class="n">Get-Content</span><span class="w"> </span><span class="nt">-Path</span><span class="w"> </span><span class="s2">"text1.txt"</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">Out-File</span><span class="w"> </span><span class="nx">out.txt</span><span class="w">
</span></code></pre></div></div>

<p>PowerShell では <code class="language-plaintext highlighter-rouge">&gt;</code>（<code class="language-plaintext highlighter-rouge">Out-File</code> 相当）と <code class="language-plaintext highlighter-rouge">Set-Content</code> で出力エンコーディングの挙動が異なるため、両方を検証しています。</p>

<h3 id="結果サマリー">結果サマリー</h3>

<p>リダイレクトや出力結果の表示は以下の様です。</p>

<ul>
  <li><strong>✅ 可能</strong>: 日本語テキストが正常に表示される</li>
  <li><strong>❌ 不可</strong>: 文字化け、表示エラー</li>
</ul>

<h4 id="cmdexechcp-932">cmd.exe（chcp 932）</h4>

<table>
  <thead>
    <tr>
      <th style="text-align: center">エンコーディング</th>
      <th style="text-align: center">結果</th>
      <th style="text-align: left">備考</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">Shift_JIS</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-8</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-8（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16LE</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16LE（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16BE</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16BE（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32LE</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32LE（BOM付き）</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: left">文字化け</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32BE</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32BE（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">ISO-2022-JP</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">EUC-JP</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
  </tbody>
</table>

<p>cmd.exe の <code class="language-plaintext highlighter-rouge">type</code> コマンドとリダイレクトは、ファイルの中身をバイト列としてそのまま読み出し、そのまま書き出します。エンコーディングの解釈や変換を行わないため、ほぼすべてのエンコーディングで正常にコピーされます。</p>

<p>唯一 UTF-32LE（BOM付き）だけが文字化けしました。UTF-32LE の BOM は <code class="language-plaintext highlighter-rouge">FF FE 00 00</code> の4バイトですが、先頭の <code class="language-plaintext highlighter-rouge">FF FE</code> は UTF-16LE の BOM と同一です。<code class="language-plaintext highlighter-rouge">type</code> コマンドが BOM を検出した際に UTF-16LE と誤認し、以降のバイト列の解釈が崩れたものと考えられます。</p>

<h4 id="windows-powershell-51">Windows PowerShell 5.1</h4>

<table>
  <thead>
    <tr>
      <th style="text-align: center">エンコーディング</th>
      <th style="text-align: center"><code class="language-plaintext highlighter-rouge">&gt;</code></th>
      <th style="text-align: center"><code class="language-plaintext highlighter-rouge">Set-Content</code></th>
      <th style="text-align: center"><code class="language-plaintext highlighter-rouge">Out-File</code></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">Shift_JIS</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-8</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-8（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16LE</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16LE（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16BE</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16BE（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32LE</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32LE（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32BE</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32BE（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: center">ISO-2022-JP</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: center">EUC-JP</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
  </tbody>
</table>

<p>Windows PowerShell 5.1 では明確なパターンが確認できます。<strong>BOM付きファイルはすべて正常に読み込めるが、BOMなしファイルは Shift_JIS 以外すべて文字化けします。</strong> これは PowerShell 5.1 が BOM でエンコーディングを判定し、BOM がない場合はシステムデフォルトの Shift_JIS（cp932）として扱う仕様に起因します。</p>

<p>ISO-2022-JP は <code class="language-plaintext highlighter-rouge">Set-Content</code> 経由のみ正常でした。<code class="language-plaintext highlighter-rouge">Set-Content</code> は <code class="language-plaintext highlighter-rouge">&gt;</code> や <code class="language-plaintext highlighter-rouge">Out-File</code> と異なり、バイト列をより素直に書き出す傾向があるためです。</p>

<p>なお、出力エンコーディングについても注目すべき挙動があります。<code class="language-plaintext highlighter-rouge">&gt;</code> および <code class="language-plaintext highlighter-rouge">Out-File</code> は入力のエンコーディングに関わらず常に <strong>UTF-16LE（BOM付き）</strong> で出力します。一方、<code class="language-plaintext highlighter-rouge">Set-Content</code> は <strong>Shift_JIS</strong> で出力します。これは PowerShell 5.1 の仕様であり、出力エンコーディングを変更するには <code class="language-plaintext highlighter-rouge">-Encoding</code> パラメータの明示的な指定が必要です。</p>

<h4 id="powershell-754">PowerShell 7.5.4</h4>

<table>
  <thead>
    <tr>
      <th style="text-align: center">エンコーディング</th>
      <th style="text-align: center"><code class="language-plaintext highlighter-rouge">&gt;</code></th>
      <th style="text-align: center"><code class="language-plaintext highlighter-rouge">Set-Content</code></th>
      <th style="text-align: center"><code class="language-plaintext highlighter-rouge">Out-File</code></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">Shift_JIS</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-8</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-8（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16LE</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16LE（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16BE</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16BE（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32LE</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32LE（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32BE</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32BE（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: center">ISO-2022-JP</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: center">EUC-JP</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
  </tbody>
</table>

<p>PowerShell 7.5.4 では、デフォルトエンコーディングが <strong>UTF-8（BOMなし）</strong> に変更されました。そのため、5.1 とは逆に <strong>Shift_JIS が文字化けし、UTF-8（BOMなし）が正常に処理されます。</strong></p>

<p>BOM付きファイルの扱いは 5.1 と同様で、BOM によるエンコーディング判定が健在です。BOMなしのファイルはデフォルトの UTF-8 として解釈されるため、UTF-8 以外のBOMなしエンコーディングは文字化けします。</p>

<p>また、5.1 では <code class="language-plaintext highlighter-rouge">&gt;</code> / <code class="language-plaintext highlighter-rouge">Out-File</code> と <code class="language-plaintext highlighter-rouge">Set-Content</code> で出力エンコーディングが異なりましたが、7.5.4 ではすべてのコマンドで統一的に <strong>UTF-8（BOMなし）</strong> で出力されます。</p>

<p>ISO-2022-JP が正常に処理されるのは、<code class="language-plaintext highlighter-rouge">Get-Content</code> がバイト列をそのまま通過させた結果と考えられます。</p>

<hr />

<h2 id="検証2エンコーディングを明示的に指定した場合の出力">検証2：エンコーディングを明示的に指定した場合の出力</h2>

<p>各コンソールでエンコーディングを指定し、日本語テキストをファイルに出力した結果です。</p>

<h3 id="cmdexe">cmd.exe</h3>
<p>検証コマンドの例:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>chcp 65001
echo "日本語です" &gt; echo_utf-8.txt
</code></pre></div></div>

<p>cmd.exe では <code class="language-plaintext highlighter-rouge">chcp</code> コマンドでコードページを切り替えます。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">エンコーディング</th>
      <th style="text-align: center">chcp</th>
      <th style="text-align: center">結果</th>
      <th style="text-align: left">備考</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">Shift_JIS</td>
      <td style="text-align: center">932</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left">デフォルト</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-8</td>
      <td style="text-align: center">65001</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16LE</td>
      <td style="text-align: center">1200</td>
      <td style="text-align: center">—</td>
      <td style="text-align: left">Invalid code page</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16BE</td>
      <td style="text-align: center">1201</td>
      <td style="text-align: center">—</td>
      <td style="text-align: left">Invalid code page</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32LE</td>
      <td style="text-align: center">12000</td>
      <td style="text-align: center">—</td>
      <td style="text-align: left">Invalid code page</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32BE</td>
      <td style="text-align: center">12001</td>
      <td style="text-align: center">—</td>
      <td style="text-align: left">Invalid code page</td>
    </tr>
    <tr>
      <td style="text-align: center">ISO-2022-JP</td>
      <td style="text-align: center">50222</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">EUC-JP</td>
      <td style="text-align: center">20932</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
  </tbody>
</table>

<p>cmd.exe はシングルバイトおよびダブルバイト系のエンコーディング（Shift_JIS、UTF-8、ISO-2022-JP、EUC-JP）に対応しています。UTF-16 や UTF-32 のようなマルチバイト固定長エンコーディングはコードページとして無効であり、コンソールでは使用できません。</p>

<h3 id="windows-powershell-51-1">Windows PowerShell 5.1</h3>

<p>検証コマンドの例:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
[Console]::InputEncoding  = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8

"日本語です" &gt; test_utf-8.txt
"日本語です" | Set-Content test_utf-8_set.txt
</code></pre></div></div>

<p>PowerShell では <code class="language-plaintext highlighter-rouge">[Console]::OutputEncoding</code>、<code class="language-plaintext highlighter-rouge">[Console]::InputEncoding</code>、<code class="language-plaintext highlighter-rouge">$OutputEncoding</code> の3つの変数でエンコーディングを設定します。出力は <code class="language-plaintext highlighter-rouge">&gt;</code>（<code class="language-plaintext highlighter-rouge">Out-File</code> 相当）と <code class="language-plaintext highlighter-rouge">Set-Content</code> の2種類で検証しました。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">エンコーディング</th>
      <th style="text-align: center"><code class="language-plaintext highlighter-rouge">&gt;</code></th>
      <th style="text-align: center"><code class="language-plaintext highlighter-rouge">Set-Content</code></th>
      <th style="text-align: left">備考</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">Shift_JIS</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-8</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16LE</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16BE</td>
      <td style="text-align: center">—</td>
      <td style="text-align: center">—</td>
      <td style="text-align: left">コンソールで使用不可（例外発生）</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32LE</td>
      <td style="text-align: center">—</td>
      <td style="text-align: center">—</td>
      <td style="text-align: left">コンソールで使用不可</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32BE</td>
      <td style="text-align: center">—</td>
      <td style="text-align: center">—</td>
      <td style="text-align: left">コンソールで使用不可</td>
    </tr>
    <tr>
      <td style="text-align: center">ISO-2022-JP</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">EUC-JP</td>
      <td style="text-align: center">—</td>
      <td style="text-align: center">—</td>
      <td style="text-align: left">コンソールで使用不可</td>
    </tr>
  </tbody>
</table>

<p>注目すべき点として、エンコーディングを設定しても <code class="language-plaintext highlighter-rouge">&gt;</code> の出力は常に <strong>UTF-16LE（BOM付き）</strong> 、<code class="language-plaintext highlighter-rouge">Set-Content</code> の出力は常に <strong>Shift_JIS</strong> になります。コンソールのエンコーディング設定はファイル出力のエンコーディングには影響しません。ファイルの出力エンコーディングを変更するには、<code class="language-plaintext highlighter-rouge">Out-File -Encoding</code> や <code class="language-plaintext highlighter-rouge">Set-Content -Encoding</code> のようにコマンドレットの <code class="language-plaintext highlighter-rouge">-Encoding</code> パラメータを使用する必要があります。</p>

<h3 id="powershell-754-1">PowerShell 7.5.4</h3>

<p>検証コマンドは Windows PowerShell 5.1 と同様です。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">エンコーディング</th>
      <th style="text-align: center"><code class="language-plaintext highlighter-rouge">&gt;</code></th>
      <th style="text-align: center"><code class="language-plaintext highlighter-rouge">Set-Content</code></th>
      <th style="text-align: left">備考</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">Shift_JIS</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-8</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16LE</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-16BE</td>
      <td style="text-align: center">—</td>
      <td style="text-align: center">—</td>
      <td style="text-align: left">コンソールで使用不可</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32LE</td>
      <td style="text-align: center">—</td>
      <td style="text-align: center">—</td>
      <td style="text-align: left">コンソールで使用不可</td>
    </tr>
    <tr>
      <td style="text-align: center">UTF-32BE</td>
      <td style="text-align: center">—</td>
      <td style="text-align: center">—</td>
      <td style="text-align: left">コンソールで使用不可</td>
    </tr>
    <tr>
      <td style="text-align: center">ISO-2022-JP</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: left">要 <code class="language-plaintext highlighter-rouge">CodePagesEncodingProvider</code> 登録</td>
    </tr>
    <tr>
      <td style="text-align: center">EUC-JP</td>
      <td style="text-align: center">—</td>
      <td style="text-align: center">—</td>
      <td style="text-align: left">コンソールで使用不可</td>
    </tr>
  </tbody>
</table>

<p>PowerShell 7.5.4 でも 5.1 と同様に UTF-16BE、UTF-32、EUC-JP はコンソールエンコーディングとして使用できません。</p>

<p>5.1 との大きな違いとして、<code class="language-plaintext highlighter-rouge">&gt;</code> も <code class="language-plaintext highlighter-rouge">Set-Content</code> もすべて <strong>UTF-8（BOMなし）</strong> で出力されます。5.1 と同様、コンソールのエンコーディング設定はファイル出力のエンコーディングには反映されません。</p>

<p>また、ISO-2022-JP を使用する場合は <code class="language-plaintext highlighter-rouge">[System.Text.Encoding]::RegisterProvider([System.Text.CodePagesEncodingProvider]::Instance)</code> による登録が事前に必要です。これは PowerShell 7 が .NET（Core）ベースであり、レガシーエンコーディングがデフォルトでは利用できないためです。</p>

<hr />

<h2 id="まとめ">まとめ</h2>

<h3 id="デフォルト設定での読み込み">デフォルト設定での読み込み</h3>

<p>3つのコンソール環境のデフォルト設定における読み込み挙動を整理すると、以下のようになります。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">条件</th>
      <th style="text-align: center">cmd.exe</th>
      <th style="text-align: center">PowerShell 5.1</th>
      <th style="text-align: center">PowerShell 7.5.4</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">デフォルトエンコーディング</td>
      <td style="text-align: center">cp932</td>
      <td style="text-align: center">cp932</td>
      <td style="text-align: center">UTF-8</td>
    </tr>
    <tr>
      <td style="text-align: left">BOMなし・デフォルトと一致</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅（Shift_JIS）</td>
      <td style="text-align: center">✅（UTF-8）</td>
    </tr>
    <tr>
      <td style="text-align: left">BOMなし・デフォルトと不一致</td>
      <td style="text-align: center">✅（バイトスルー）</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: left">BOM付き</td>
      <td style="text-align: center">✅（バイトスルー）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-32LE（BOM付き）</td>
      <td style="text-align: center">❌（BOM誤認）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
  </tbody>
</table>

<p>cmd.exe はエンコーディング変換を行わないバイトスルー方式のため、ほぼすべてのファイルをそのまま通過させます。PowerShell は読み込み時にエンコーディングを解釈するため、BOMなしファイルでデフォルトと異なるエンコーディングは文字化けします。</p>

<h3 id="デフォルト設定での出力エンコーディング">デフォルト設定での出力エンコーディング</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">コマンド</th>
      <th style="text-align: center">cmd.exe</th>
      <th style="text-align: center">PowerShell 5.1</th>
      <th style="text-align: center">PowerShell 7.5.4</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">&gt;</code> リダイレクト</td>
      <td style="text-align: center">入力と同一（バイトスルー）</td>
      <td style="text-align: center">UTF-16LE（BOM付き）</td>
      <td style="text-align: center">UTF-8（BOMなし）</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">Set-Content</code></td>
      <td style="text-align: center">—</td>
      <td style="text-align: center">Shift_JIS</td>
      <td style="text-align: center">UTF-8（BOMなし）</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">Out-File</code></td>
      <td style="text-align: center">—</td>
      <td style="text-align: center">UTF-16LE（BOM付き）</td>
      <td style="text-align: center">UTF-8（BOMなし）</td>
    </tr>
  </tbody>
</table>

<h3 id="実務上の指針">実務上の指針</h3>

<p><strong>cmd.exe</strong> はエンコーディング変換を行わないため、ファイルのコピーやリダイレクトでは最も安全です。ただし UTF-32LE（BOM付き）は BOM の誤認により文字化けするので注意が必要です。</p>

<p><strong>Windows PowerShell 5.1</strong> を使用する場合、BOMなしの UTF-8 ファイルを扱うには <code class="language-plaintext highlighter-rouge">-Encoding UTF8</code> を明示する必要があります。また、<code class="language-plaintext highlighter-rouge">&gt;</code> の出力が UTF-16LE（BOM付き）になることを認識しておくべきです。</p>

<p><strong>PowerShell 7.5.4</strong> はデフォルトが UTF-8 に統一されており、現代の開発環境では最も扱いやすい選択です。ただし、レガシーな Shift_JIS ファイルを扱う場合は <code class="language-plaintext highlighter-rouge">-Encoding</code> パラメータでの明示的な指定が必要になります。</p>

<p>BOMなしのファイルを確実に扱うには、どのコンソール環境でも <code class="language-plaintext highlighter-rouge">-Encoding</code> パラメータなどでエンコーディングを明示的に指定することが推奨されます。</p>]]></content><author><name>snow-stack</name></author><category term="文字エンコーディング" /><category term="Character Encoding" /><category term="Shift_JIS" /><category term="UTF-8" /><category term="UTF-16" /><category term="BOM" /><summary type="html"><![CDATA[はじめに]]></summary></entry><entry><title type="html">Windows 11 標準アプリ 文字エンコーディング対応状況まとめ</title><link href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/14/encoding-report.html" rel="alternate" type="text/html" title="Windows 11 標準アプリ 文字エンコーディング対応状況まとめ" /><published>2026-02-14T00:00:00+00:00</published><updated>2026-02-14T00:00:00+00:00</updated><id>https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/14/encoding-report</id><content type="html" xml:base="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/14/encoding-report.html"><![CDATA[<h2 id="はじめに">はじめに</h2>

<p>Windows 11 上で利用できる主要なアプリケーションが、どの文字エンコーディングに対応しているのかを実際に検証しました。</p>

<p>テキストファイルや CSV を扱う際に「文字化け」に遭遇した経験は、多くの方にあると思います。特に日本語環境では、Shift_JIS と UTF-8 の混在が長年の課題となっています。しかし、実際にどのアプリがどのエンコーディングに対応しているのかを体系的にまとめた情報は意外と少ないのが現状です。</p>

<p>本記事では、メモ帳・VS Code・Excel・Edge・Chrome・エクスプローラー プレビューを対象に、各種エンコーディングのファイルを実際に開いて閲覧・保存できるかを検証した結果をまとめます。</p>

<blockquote>
  <p><strong>補足:</strong> cmd・Windows PowerShell・PowerShell・Visual Studio については、別の記事で検証結果をまとめる予定です。</p>
</blockquote>

<h2 id="検証環境">検証環境</h2>

<table>
  <thead>
    <tr>
      <th style="text-align: left">項目</th>
      <th style="text-align: left">バージョン</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">OS</td>
      <td style="text-align: left">Windows 11 Pro（25H2）</td>
    </tr>
    <tr>
      <td style="text-align: left">メモ帳</td>
      <td style="text-align: left">（バージョン:  11.2510.14.0 ）</td>
    </tr>
    <tr>
      <td style="text-align: left">VS Code</td>
      <td style="text-align: left">（バージョン:  1.109.3 ）</td>
    </tr>
    <tr>
      <td style="text-align: left">Excel 2024</td>
      <td style="text-align: left">（バージョン:  2601 . 64bit）</td>
    </tr>
    <tr>
      <td style="text-align: left">Microsoft Edge</td>
      <td style="text-align: left">（バージョン:  144.0.3719.115 ）</td>
    </tr>
    <tr>
      <td style="text-align: left">Google Chrome</td>
      <td style="text-align: left">（バージョン:  145.0.7632.46）</td>
    </tr>
  </tbody>
</table>

<h2 id="検証方法">検証方法</h2>

<p>各エンコーディングでテキストファイルを作成し、対象アプリで開いた際の挙動を確認しました。</p>

<ul>
  <li><strong>閲覧</strong>: ファイルを開いて日本語テキストが正常に表示されるかを確認</li>
  <li><strong>保存</strong>: アプリからファイルを保存する際に選択できるエンコーディングを確認</li>
</ul>

<p>判定基準は以下の通りです。</p>

<ul>
  <li><strong>✅ 可能</strong>: 日本語テキストが正常に表示される</li>
  <li><strong>❌ 不可</strong>: 文字化け、表示エラー、またはファイルを開けない</li>
</ul>

<h2 id="検証結果">検証結果</h2>

<h3 id="閲覧対応">閲覧対応</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">エンコーディング</th>
      <th style="text-align: center">メモ帳</th>
      <th style="text-align: center">VS Code</th>
      <th style="text-align: center">Excel CSV</th>
      <th style="text-align: center">Edge</th>
      <th style="text-align: center">Chrome</th>
      <th style="text-align: center">エクスプローラー</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">Shift_JIS</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-8（BOM無し）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-8（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-16LE（BOM無し）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-16LE（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-16BE（BOM無し）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-16BE（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-32LE（BOM無し）</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-32LE（BOM付き）</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-32BE（BOM無し）</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-32BE（BOM付き）</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: left">ISO-2022-JP</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td style="text-align: left">EUC-JP</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">❌</td>
    </tr>
  </tbody>
</table>

<h3 id="保存対応">保存対応</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">エンコーディング</th>
      <th style="text-align: center">メモ帳</th>
      <th style="text-align: center">VS Code</th>
      <th style="text-align: center">Excel CSV</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">Shift_JIS（ANSI）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">—</td>
      <td style="text-align: center">✅ <strong>（デフォルト）</strong></td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-8（BOM無し）</td>
      <td style="text-align: center">✅ <strong>（デフォルト）</strong></td>
      <td style="text-align: center">✅ <strong>（デフォルト）</strong></td>
      <td style="text-align: center">—</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-8（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">—</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-16LE（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">—</td>
      <td style="text-align: center">—</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-16BE（BOM付き）</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">—</td>
      <td style="text-align: center">—</td>
    </tr>
  </tbody>
</table>

<p>Edge・Chrome・エクスプローラー プレビューはビューア専用のため、保存機能の検証対象外としています。</p>

<h3 id="保存時の補足事項">保存時の補足事項</h3>

<p><strong>メモ帳:</strong> 保存ダイアログからエンコーディングを選択できます。デフォルトは UTF-8（BOM無し）です。</p>

<p><strong>VS Code:</strong> 保存時にエンコーディングを指定する標準UIはありません。デフォルトの UTF-8（BOM無し）で保存されます。</p>

<p><strong>Excel CSV:</strong> 「名前を付けて保存」でファイル形式に「CSV UTF-8」を選択した場合のみ UTF-8（BOM付き）で保存されます。それ以外のファイル形式（CSV、txt、prn、htm）では、すべて Shift_JIS で保存されます。</p>

<h2 id="考察">考察</h2>

<h3 id="bomの有無がもたらす影響">BOMの有無がもたらす影響</h3>

<p>検証結果から最も顕著に読み取れるのは、BOM（Byte Order Mark）の有無がファイルの閲覧可否に大きく影響するという点です。</p>

<p>UTF-16 では、BOM付きであればほとんどのアプリで正常に表示できますが、BOM無しの場合はメモ帳以外のすべてのアプリで文字化けが発生しました。メモ帳が BOM無しの UTF-16 を読める唯一のアプリである点は注目に値します。</p>

<p>UTF-8 については、BOM無しでも大半のアプリが対応しています。唯一の例外が Excel CSV で、UTF-8（BOM無し）のファイルは文字化けします。これは長年知られている問題であり、Excel で UTF-8 の CSV を扱う場合は BOM付きが事実上の必須条件です。</p>

<p>UTF-32 は BOM の有無に関わらず、ほぼすべてのアプリで非対応でした。Excel CSV とエクスプローラー プレビューが UTF-32LE（BOM付き）のみ表示できるという結果は意外でしたが、実用上 UTF-32 を使う場面はほとんどないでしょう。</p>

<h3 id="アプリごとの対応傾向">アプリごとの対応傾向</h3>

<p><strong>メモ帳</strong> は閲覧においてはもっとも幅広いエンコーディングに対応しています。UTF-16 の BOM無しを唯一読めるアプリであり、保存時も5種類のエンコーディングを選択できます。ただし、UTF-32 やレガシーな日本語エンコーディング（ISO-2022-JP、EUC-JP）には対応していません。</p>

<p><strong>VS Code</strong> はテキストエディタとしては標準的な対応範囲ですが、いくつか注意点があります。ISO-2022-JP を UTF-8 と誤認識して文字化けする、UTF-32LE（BOM付き）を UTF-16LE と誤認識するなど、自動検出の誤りが見られました。一方で EUC-JP には対応しており、レガシーファイルの取り扱いでは部分的に役立ちます。</p>

<p><strong>Excel CSV</strong> は BOM への依存度がもっとも高いアプリです。Shift_JIS と BOM付きエンコーディング以外はほぼ文字化けします。保存時のデフォルトが Shift_JIS である点も、UTF-8 が主流となった現在では注意が必要です。</p>

<p><strong>Edge / Chrome</strong> は閲覧対応がまったく同じ結果でした。ISO-2022-JP と EUC-JP に対応している唯一のアプリ群であり、レガシーな日本語 HTML ファイルの表示には依然としてブラウザが最適です。</p>

<p><strong>エクスプローラー プレビュー</strong> は UTF-16BE（BOM付き）が表示できない（「表示できない」旨のメッセージが出る）一方で、UTF-32LE（BOM付き）は表示できるという独特な挙動を示しました。</p>

<h3 id="excel-vba-のエンコーディング制約">Excel VBA のエンコーディング制約</h3>

<p>Excel VBA でファイルの読み書きを行う際のエンコーディング対応は、他のアプリと比べて大きな制約があります。</p>

<p>VBA の String 型は内部的に UTF-16LE で文字列を保持しています。このため、ファイル I/O でもUTF-16LE が基本となります。</p>

<p><strong>Open 文 / FileSystemObject</strong> では、Shift_JIS、UTF-16LE（BOM付き）、UTF-16LE（BOM無し）の 3 種類のみ対応しています。UTF-8 を指定する選択肢自体が存在しません。</p>

<p><strong>ADODB.Stream</strong> を使えば UTF-8 の読み書きが可能になりますが、標準で安定して動作するのは BOM付きの UTF-8 と UTF-16LE のみです。BOM無し UTF-8 を扱うには、BOM の読み飛ばし処理を VBA コード側で実装する必要があり、標準機能だけでは対応できません。</p>

<p>UTF-8 の CSV ファイルを VBA で処理したいという需要は多いにもかかわらず、VBA 単体での UTF-8 対応は限定的です。ADODB.Stream を使った BOM付き UTF-8 の読み書きが、現時点でのもっとも現実的な選択肢となります。</p>

<h3 id="レガシーエンコーディングの対応状況">レガシーエンコーディングの対応状況</h3>

<p>ISO-2022-JP と EUC-JP に対応しているのは、ブラウザ（Edge / Chrome）と VS Code（EUC-JP のみ）だけでした。</p>

<p>かつて日本語 Web サイトやメールで広く使われたこれらのエンコーディングは、テキストエディタ系のアプリではもはや自動認識の対象外となりつつあります。古い日本語ファイルを扱う必要がある場合は、ブラウザで開くか、nkf などの変換ツールで事前に UTF-8 へ変換しておくのが安全です。</p>

<h2 id="実務での推奨">実務での推奨</h2>

<p>検証結果を踏まえた、用途別のエンコーディング推奨は以下の通りです。</p>

<p><strong>テキストファイル全般:</strong> UTF-8（BOM無し）がもっとも広く対応されており、第一選択として推奨します。</p>

<p><strong>Excel で扱う CSV:</strong> UTF-8（BOM付き）を使用してください。BOM無しでは Excel で文字化けします。</p>

<p><strong>VBA でのファイル入出力:</strong> ADODB.Stream を使用し、UTF-8（BOM付き）で読み書きするのが現実的です。Open 文や FileSystemObject では UTF-8 を扱えません。</p>

<p><strong>HTML ファイル:</strong> UTF-8 で作成し、<code class="language-plaintext highlighter-rouge">&lt;meta charset="UTF-8"&gt;</code> を記述してください。ブラウザはレガシーエンコーディングにも対応していますが、新規作成するファイルで使う理由はありません。</p>

<p><strong>他のアプリとの互換性を最大化したい場合:</strong> UTF-8（BOM付き）がもっとも安全です。すべてのアプリで閲覧可能であり、Excel CSV の文字化けも回避できます。ただし、プログラムやスクリプトから読み込む際に BOM が問題になるケースがある点には注意してください。</p>]]></content><author><name>snow-stack</name></author><category term="文字エンコーディング" /><category term="Character Encoding" /><category term="Shift_JIS" /><category term="UTF-8" /><category term="UTF-16" /><category term="BOM" /><summary type="html"><![CDATA[はじめに]]></summary></entry><entry><title type="html">Windows 固有の文字エンコーディング問題</title><link href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/06/Windows-%E5%9B%BA%E6%9C%89%E3%81%AE%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E5%95%8F%E9%A1%8C.html" rel="alternate" type="text/html" title="Windows 固有の文字エンコーディング問題" /><published>2026-02-06T00:00:00+00:00</published><updated>2026-02-06T00:00:00+00:00</updated><id>https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/06/Windows%20%E5%9B%BA%E6%9C%89%E3%81%AE%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E5%95%8F%E9%A1%8C</id><content type="html" xml:base="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/02/06/Windows-%E5%9B%BA%E6%9C%89%E3%81%AE%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E5%95%8F%E9%A1%8C.html"><![CDATA[<p>以前の記事で、日本社会全般の視点で日本語文字エンコーディングの新旧混在問題を解説しました。</p>

<p><a href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/01/12/%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91-%E3%81%AF%E3%81%AA%E3%81%9C%E7%B5%82%E3%82%8F%E3%82%89%E3%81%AA%E3%81%84-%E6%97%A5%E6%9C%AC%E3%81%AEIT%E3%82%92%E7%B8%9B%E3%82%8B%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%B7%B1%E3%81%84%E9%97%87.html">「文字化け」はなぜ終わらない？ 日本のITを縛る文字エンコーディングの深い闇</a></p>

<p>今回は、Windowsユーザーの視点で、この日本語文字エンコーディングの新旧混在問題について、解説したいと思います。</p>

<p>現代、Web界隈では完全に UTF-8 がテキストデータを支配しており、若い人を始め、十数年前から IT機器を使い始めたユーザーには、「なぜ、文字エンコーディングが問題になるのか」が理解できない人が増えていると感じます。<br />
そもそも「なぜ、BOM付きUTF-8などという物が存在するのか」が分からない若者も多いのではないでしょうか。</p>

<p>「BOM付きUTF-8」は完全にWindows固有の問題であり、そして同時に無くては困るものでもあります。<br />
また、これに関連してWindowsワールドでは古い文字エンコーディングに付随する形で、テキストの扱いが難しくなっている問題があります。<br />
Linux や Mac OS には存在しない Windows 固有のテキスト問題を、ここに纏めておきたいと思います。</p>

<h2 id="pc三大勢力">PC三大勢力</h2>

<p>昔からPC規格には、今と同じ三大勢力が存在していました。<br />
UNIX勢力、Apple勢力、Microsoft勢力です。<br />
今は、それぞれ Linux OS、Mac OS、Windows に収まっていますが、少し昔は UNIX規格には様々なOSが存在し、Apple PC の OSは現在の Mac OS とは規格の異なるOSを採用していました。<br />
Windowsが登場する前は、MS-DOS が Microsoftの主力OSでした。<br />
それぞれの勢力の日本語対応もバラバラで、日本語圏においては、今より互い勢力圏の間でのテキスト交換が困難な状況でした。</p>

<h3 id="昔の三大勢力のテキスト規格">昔の三大勢力のテキスト規格</h3>

<p>1990年代から2005年頃までのPC三大勢力のテキスト規格</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">OS勢力圏</th>
      <th style="text-align: left">日本語文字エンコーディング</th>
      <th style="text-align: left">改行コード規格</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">UNIX系各種OS</td>
      <td style="text-align: left">EUC-JP</td>
      <td style="text-align: left">LF</td>
    </tr>
    <tr>
      <td style="text-align: left">Apple System7 等 旧OS</td>
      <td style="text-align: left">Shift_JIS</td>
      <td style="text-align: left">CR</td>
    </tr>
    <tr>
      <td style="text-align: left">Microsoft DOS\&amp;Windows</td>
      <td style="text-align: left">Shift_JIS</td>
      <td style="text-align: left">CR・LF</td>
    </tr>
  </tbody>
</table>

<p>Unicode 規格が普及し始めたのは、2000年代中盤頃からなので、この時代に UTF-8 も UTF-16 もPCでは使用されていません。<br />
1990年前後から2005年までで15年です。その前後5年ぐらいを加えて25年ぐらいの期間は、この古いテキスト規格で、企業や官公庁でテキストデータが作成されてきたということです。<br />
そのデータ蓄積の大きさを想像してみてください。</p>

<h3 id="2000年代のテキスト規格の革新">2000年代のテキスト規格の革新</h3>

<p>2000年代は、三大勢力全般にOS全般の革新が起こり、同時にテキスト規格も様変わりしました。</p>

<h4 id="os-規格の革新">OS 規格の革新</h4>

<p>UNIX勢力の中に Linux OS が台頭し始め、Web Server を中心に急激に普及しました。<br />
これにより、他のUNIX系OSは存在感を急速に失い、UNIX系の規格を採用したOSとしては、Linux OS がデファクトスタンダードのような存在になっていきました。<br />
（ちなみに Linux は正式な UNIX ではありませんが、ほぼ UNIX と考えて差し支え無い規格の OSカーネルです）</p>

<p>Apple は、当初からモトローラーのCPUを採用していましたが、その性能がインテルCPUに対して劣っていたため、Apple社は Mac のCPUをインテルCPUに変更し、それに伴って Mac の OS を、それまでの System 7 系統から UNIX規格の Mac OS に変更しました。<br />
これに伴い、Mac の テキスト規格も UNIX規格に変更されました。</p>

<p>Microsoft は UNIX勢力や Apple より、PC市場では後発だったため、当初 MS-DOS を投入するとき、既に作られていた UNIXやApple旧OS のテキストデータを読み込める規格にする必要がありました。<br />
米国では、テキストコードは ASCII で統一されているので、ここは問題ありませんが、改行コードは UNIX は LF、Apple旧OS は CR とバラバラだったので、どちらの改行にも対応できるように CR・LF を改行コードに定めました。<br />
Microsoft は最初からインテルCPUを採用していたので、現在に至るまで OS 自体の規格変更は行っていません。WindowsはMS-DOSのテキスト規格を継承しています。</p>

<h4 id="unicode-の台頭">Unicode の台頭</h4>

<p>2000年代は、米国以外の各国において文字エンコーディングが古いものから Unicode 規格の文字エンコーディングへ切り替わった時代でした。<br />
当初、Unicode の文字エンコーディングは、UTF-16 が主流でしたが、その後 UTF-8 が登場して現代では、UTF-8 が世界標準の文字エンコーディングとなりました。<br />
ちょうど、三大勢力のOS が、古いものから新しいものへと、切り替わるタイミングと一致した影響も大きいと思われます。</p>

<h3 id="今の三大勢力のテキスト規格">今の三大勢力のテキスト規格</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">OS勢力圏</th>
      <th style="text-align: left">日本語文字エンコーディング</th>
      <th style="text-align: left">改行コード規格</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">Linux OS (GNU Linux)</td>
      <td style="text-align: left">UTF-8 (BOM 無し)</td>
      <td style="text-align: left">LF</td>
    </tr>
    <tr>
      <td style="text-align: left">Apple Mac OS</td>
      <td style="text-align: left">UTF-8 (BOM 無し)</td>
      <td style="text-align: left">LF</td>
    </tr>
    <tr>
      <td style="text-align: left">Windows</td>
      <td style="text-align: left">UTF-8 (BOM 付き)</td>
      <td style="text-align: left">CR・LF</td>
    </tr>
  </tbody>
</table>

<p>Windows は、旧 Windows PowerShell など、一時 UTF-16LE を採用していた時期がありますが、最新の PowerShell7 などでは UTF-8 を採用しています。<br />
また、OS や ファイルシステムや DBMS の内部では、UTF-16 が今でも活用されています。<br />
.NET や JavaVM の内部も UTF-16 を使用しています。</p>

<p>現代では、ユーザーの目に触れる部分では、テキスト規格は UTF-8 にほぼ統一されています。</p>

<h3 id="今では-windows-規格だけが孤立している">今では Windows 規格だけが孤立している</h3>

<p>元々、Windows規格 は UNIX のテキストも Mac のテキストも読めるように作られた規格ですが、後の世でMacとLinuxの革新が、UTF-8とUNIXテキスト規格に統合された事により、Windowsだけが孤立したテキスト規格を採用している状態になってしまいました。</p>

<p>これは、Microsoft社が悪いわけではなく、「運が悪かった」としか言いようがありません。</p>

<h2 id="windows--早く普及した弊害">Windows － 早く普及した弊害</h2>

<p>プログラマーでもハッカー（コンピュータのヘビーユーザー）でもない、一般ユーザーに早く普及したOSは Windows です。<br />
Windows 95 以降は、急激に「普通の人」がPCを利用するようになりました。<br />
一方、この時代は、UNIXはまだ高価なワークステーションでしか利用できない状態で、Linuxはカーネルの初期バージョンが登場したばかりで、本格的ディストリビューションの普及はまだまだ先の話でした。<br />
Apple の Mac は Windows との競争に苦戦していた時期で、時々 iMac などヒット商品を出していましたが、Windows 95 以降の Microsoft の躍進に比べると、地味な存在で「一部のマニアの使うPC」という位置づけでした。<br />
企業や公的機関で本格的に採用されていたのは、Microsoft Windows でした。</p>

<p>そのような背景があるため、社会で次々作成されるテキストデータは、大半が Windows 規格のテキストでした。文字エンコーディングが Shift_JIS で、改行コード CR・LF のデータが量産されていったのです。</p>

<p>Linuxが本格的に普及し始めたのは、2000年代で、既に Unicode の時代に変わっていました。<br />
Apple Mac は 2000年代に、障害となっていた モトローラーCPU の性能問題を克服するためにインテルCPUへ切り替え、同時に UNIX OS に更新したため、同時に Unicode 規格に変更しました。<br />
もともと企業や官公庁に大きく普及していたわけではないので、経路依存性の障害は小さく、過去のテキスト規格を事実上放棄して、UNIX 規格に全面切り替えました。</p>

<p>Microsoft Windows は企業や官公庁に広く普及しており、ユーザーのデータ資産を守る責任を無視できない立場にありました。<br />
時代のテキスト規格が、Unicode に切り替わる局面において、最も経路依存性の障害が大きかったのは、Microsoft Windows と言えると思います。<br />
Windows の普及が他のOSに比べて早かったことによる弊害と言えるでしょう。</p>

<h3 id="過去データを捨てられない">過去データを捨てられない</h3>

<p>Windows においては、古いテキスト規格のデータだけでなく、古いテキスト規格を使用する古いソフトウェアが大量に存在します。<br />
これらのソフトウェアの Unicode 規格への更新は、日本社会においてはまだ完了していません。<br />
古いソフトウェアは、今でも古いテキスト規格のデータを量産しています。</p>

<p>過去の古いデータの蓄積量も膨大で、全てのデータの Unicode への変換は不可能なケースも少なくないです。</p>

<p>また、Windows には短期間ではありますが、UTF-16LE を Unicode 標準として採用した時期があり、そのとき作られた UTF-16LE テキストも古いテキストデータとして残っています。<br />
今でも Windows PowerShell の標準文字エンコーディングは UTF-16LE です。</p>

<p>Windows 環境では、しばらくの間は古いテキスト規格と、新しいテキスト規格を共存させる必要があります。<br />
その新旧テキストの共存を実現するために必要になったのが「BOM付きUTF-8」です。</p>

<p>Windows の古いテキスト文字エンコーディングは、Shift_JIS です。<br />
Shift_JIS のテキストと、UTF-8、 UTF-16LE のテキストを、各アプリケーションが識別できなければなりません。<br />
しかし、Shift_JIS と UTF-8 と UTF-16LE を、予備情報無しで識別するのは難しく、完全な信頼性で識別するのは不可能と考えて良いです。<br />
文字エンコーディングを識別するソフトウェアは、バイナリパターンから文字エンコーディングを高確率で「推測」しているだけで、100%確実な文字エンコーディング・バイナリパターン推測の方法は存在しないのです。</p>

<h3 id="bom問題">BOM問題</h3>

<p>Microsoft も完全な識別を保証できない文字エンコーディング・バイナリパターン推測に依存するわけにはいきませんから、確実に Shift_JIS と UTF-8 と UTF-16LE を識別できる手段を採用しています。<br />
その手段が BOM です。</p>

<p>BOM とは、Byte Order Mark の略で、テキストファイルの先頭に Unicode のエンコーディング種類を示すマークを付けて、そのテキストがどのUnicode文字エンコーディングかを識別する仕組みです。</p>

<p>Unicode には、５つの文字エンコーディングが存在し、Unicode 標準化委員会がそれぞれを区別するために定めた、Unicode の標準規格です。Microsoft の独自規格ではありません。<br />
BOMは、文字として扱われない短いバイナリパターンです。<br />
５つの文字エンコーディングとそれぞれのBOMのバイナリパターン（16進数の数値）は、以下の表のように対応しています。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">文字エンコーディング</th>
      <th style="text-align: left">BOMのバイナリパターン（16進数）</th>
      <th style="text-align: left">BOMの長さ（バイト数）</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">UTF-8</td>
      <td style="text-align: left">EF, BB, BF</td>
      <td style="text-align: left">３バイト</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-16 LE</td>
      <td style="text-align: left">FF, FE</td>
      <td style="text-align: left">２バイト</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-16 BE</td>
      <td style="text-align: left">FE, FF</td>
      <td style="text-align: left">２バイト</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-32 LE</td>
      <td style="text-align: left">FF, FE, 00, 00</td>
      <td style="text-align: left">４バイト</td>
    </tr>
    <tr>
      <td style="text-align: left">UTF-32 BE</td>
      <td style="text-align: left">00, 00, FE, FF</td>
      <td style="text-align: left">４バイト</td>
    </tr>
  </tbody>
</table>

<p>Windows のテキストファイルでは、UTF-8 と UTF-16LE のテキストファイル先頭に、このBOMが付加されています。<br />
Excelで、Unicode の CSV を保存すると、CSVファイルの先頭に ｛EF，BB，BF｝ のBOMが書き込まれます。<br />
Excelでは「通常のCSVファイル保存」を行った場合は、今でも Shift_JIS で保存されます。当然 BOM は付きません。（Shift_JIS の BOM という規格は存在しません）</p>

<p>この仕様は、ユーザーにとって文字化けなど様々なトラブルの原因になっています。</p>

<p>ExcelのCSV保存は、典型的なWindows経路依存性問題の中心的存在です。</p>

<h4 id="lelittle-endianbebig-endianとは">LE(Little Endian)・BE(Big Endian)とは</h4>

<p>ちなみに、LE とか BE というのは、CPUがメモリから数値を読み込むときに、１バイトづつ読み込むわけですが、現代は64ビット（8バイト）CPUの時代なのでCPUの扱う整数値も64ビット（8バイト）になります。<br />
バイト単位で数値を読み込むとき、8バイトの数値をメモリから読み込むことになりますが、このとき8バイトのCPUレジスタ（CPU内の記憶領域）へ、メモリの先頭からバイト単位でコピーすることになります。このコピーを8バイトのレジスタの「先頭から後ろのバイトへの順番」に書き込むのか、「後ろから前のバイトへの順番」に書き込むのか、CPUの仕様によって異なります。<br />
前者をBE(Big Endian)、後者をLE(Little Endian)と呼びます。<br />
文字エンコーディングのLEやBEとは、CPUのLEに合わせた文字エンコーディングです。<br />
インテルやARMはLE、昔のモトローラーCPUやJavaVMはBEで作られています。<br />
インターネットもBEを標準としています。<br />
このLE(Little Endian),BE(Big Endian)については、深く理解する必要はありません。「文字エンコーディングの種類が違う」とだけ理解してください。</p>

<h3 id="wsl採用の弊害">WSL採用の弊害</h3>

<p>2010年代には、ソフトウェア開発者の多くが Linux ベースで開発を行うようになりました。<br />
Docker、Node.js、Python、Rubyなど、モダンな開発ツールはLinux環境で最も快適に動作する上に、開発者がLinuxネイティブなコマンドラインツール（bash, grep, awkなど）を使えないと、Windowsから離れて、Linuxへ移ってしまうため、MicrosoftはWindows上でLinux開発環境を使える WSL (Windows Subsystem for Linux) を、2017年頃から導入しました。<br />
WSLを使用すると、Windows上のファイルをLinuxで直接閲覧編集することができるようになります。</p>

<p>しかし、逆にWindows 上で Linux が使用できるようになったことにより、Windows上のPowerShellやエディタなどでも Linux の「BOM無しUTF-8」テキストファイルを扱う必要性が出てきました。<br />
また、GitHUBを買収したことにより、オープンソース系のLinuxテキストファイルの読み書きも、できなければならなくなりました。こちらも「BOM無しUTF-8」テキストファイルを扱わなければならない要因です。</p>

<p>Microsoft社がLinuxを初めとしたOSS界を肯定したことにより、「BOM無しUTF-8テキスト」と「LFのみの改行コード」を無視できなくなったのです。</p>

<h3 id="メモ帳がbomなしutf-8に対応">「メモ帳」が「BOMなしUTF-8」に対応</h3>

<p>2019年5月のWindowsアップデートから、標準の「メモ帳」が「BOMなしUTF-8」のテキストファイルに対応しました。世界標準に合わせる為です。</p>

<p>これにより、LinuxやMac由来のUTF-8テキストファイルの文字化けは、格段に減少したそうですが、逆に古いShift_JISテキストは文字化けが、Windows環境で頻発するようになったようです。</p>

<p>当たり前です。</p>

<p>現在のWindows環境は、テキストファイルに関しては、BOMの有無だけでは、Shift_JISなのかUTF-8なのか明確にならない中途半端な状況になっており、レガシーなシステムを扱っている企業や自治体・官公庁、そして金融機関に医療機関などでは、メモ帳がアテにならない状態になっています。<br />
メモ帳で、Shift_JISもUTF-8もUTF-8-BOMも全て開けますが、Excelは「BOM無しUTF-8」のCSVを開くと文字化けします。</p>

<p>むしろ、昔の秀丸やサクラエディタの方が日本語文字エンコーディング・改行コード・BOMの判別機能を持っているので、安全かも知れません。</p>

<p>現状のWindowsは、「Shift_JISとUTF-8テキストファイルの違いとBOMの有無・改行コード種類」の区別を、以前よりもユーザーが自己責任で識別しなければならない面倒な時代になっています。</p>

<h2 id="mac-os-と-linux系os-には存在しない問題">Mac OS と Linux系OS には存在しない問題</h2>

<p>既に解説していますが、Mac OS と Linux系OS には、この Shift_JIS と UTF-8 が混在する問題も、改行コードCR・LFとLFの混在問題も、「UTF-8のBOMの有無」問題も存在しません。<br />
Mac OS と Linux系OS では、文字エンコーディングはUTF-8のBOM無し、改行コードはLFのみ、で統一されています。<br />
過去の歴史的経緯から運悪く、Windows環境だけで面倒くさい状況になっているのです。</p>

<h2 id="標準的な対策ツール">標準的な対策ツール</h2>

<p>テキストファイルの文字エンコーディングと改行コードやBOMの有無を、調べたり変更したりするツールは、昔からいくつか存在します。<br />
昔は、Windowsのシェアが圧倒的だったので、文字エンコーディングと改行コードやBOMの有無の問題に晒されるのは、UNIXやMacの側である事が多かったようです。<br />
そのため、この問題の対策ツールも、主要なものはUNIX環境で開発されています。</p>

<p>代表的なツールは、file , iconv , nkf というコマンドツールです。<br />
file と iconv は、UNIX系シェルでしか使用できません。PowerShell や cmd では使えません。<br />
Windows環境で使用するならば、WSLでWindowsの領域を参照して、bashでfileとiconvを使用するか、Git Bash をインストールして、Bash上で fileとiconvを使用するのが、簡単確実な方法です。<br />
ただし、iconv は日本語の推測精度があまり高くないようです。<br />
fileは文字エンコーディングに対処するツールではなく、改行コードの確認と変換に使用できるツールです。</p>

<p>PowerShell でも文字エンコーディングの変換はできますが、文字エンコーディングの確認手段がありません。<br />
また、多くの場合、PowerShell ではいちいちスクリプトを組まなければ、文字エンコーディングと改行コードやBOMの有無に対処することができないケースが多く、手軽さに欠けるのが現実です。</p>

<p>nkfコマンドは例外的に、PowerShell や cmd で使用できますが、nkfもUNIX標準で開発されているコマンドツールで、ワイルドカード展開はシェル任せで、Windows上では使用できません。<br />
また、PowerShellのオブジェクトパイプラインに対応していませんから、nkfの特徴であるリダイレクトによる文字エンコーディングの変換機能などが使えません。<br />
nkfの開発者は初めからUNIXに合わせて開発しているので、PowerShellに合わせる動機は無いでしょう。</p>

<p>つまり、残念ながらWindowsユーザーは、問題の震源地であるWindows環境では、問題を解決する多くのツールが使用できないという、非常に不幸な状況に陥っています。</p>

<p>Windows環境で、対象ファイルが一つ二つ程度ならば、昔から存在している秀丸エディタやサクラエディタが文字エンコーディング確認機能と、改行コード・BOMの確認機能を持っており、それぞれの変換も可能なので、便利だと思います。<br />
UNIX環境ならnkfがワイルドカードで一括処理ができるので便利ですが、Windows環境のPowerShellとcmdでは、ワイルドカードが使えません。一つずつファイルを処理するなら、昔のエディタの方が良いでしょう。<br />
Windowsならば、個人が開発しているシェアウェアに良いツールが沢山あると思います。</p>

<p>先日、私がリリースしたOSSツール（MITライセンス）も、この問題を解決するツールです。<br />
PowerShellとcmdで動作します。<br />
逆に、UNIX環境には合わせていません。<br />
PowerShellとcmdの標準に合わせて開発しています。<br />
複数ファイルを一括で処理できます。<br />
文字エンコーディング確認機能と、改行コード・BOMの確認機能、それぞれの編集機能を持ちます。</p>

<p><a href="https://snow-stack.net/tool_rmsmf_guide/">rmsmf-txprobe &amp; mfsr-mfprobe 使い方の分かりやすい解説</a></p>

<p>既存ツール類に満足できなければ、試してみてください。</p>

<h2 id="将来予測">将来予測</h2>

<p>MicrosoftはWSL導入以降、テキストファイルの扱い方で迷走しているように見えます。</p>

<p>「メモ帳など一部だけBOM無しUTF-8に対応している」この状況は、主にLinux系開発環境を使用している開発者には、好ましいかも知れませんが、レガシーデータやレガシーシステムを扱っているエンジニアには、面倒な上に「どっちつかず」の中途半端で対処に困る状況ではないでしょうか。<br />
現在の状況は、「テキスト文字エンコーディングの判別はユーザーの自己責任」という、かなり無責任な状況と言えます。</p>

<p>元々、Microsoftは、当初OSSに対して懐疑的な姿勢を示していましたが、2017年頃から戦略を大きく転換し、OSSへの対応を強化してきました。</p>

<p>メモ帳が「BOM無しUTF-8」に対応したこと、その理由は「世界標準に合わせるため」という、この状況から将来のMicrosoftの方針を予測すると、誰が予測しても「WindowsはUNIX標準テキストに合わせる」という将来が見えてきます。</p>

<p>UNIX標準テキストとは既に説明したように、「文字エンコーディングは UTF-8 、改行コードは LF のみ、UTF-8テキストの先頭にBOMは付けない」という仕様です。</p>

<p>もし、Windows標準テキストがUNIX標準に従うことになれば、現在のWindows標準である「BOM無しテキストはShift_JIS、BOM付きテキストはUnicodeエンコーディング、改行コードはCR・LF」というテキスト仕様は、丸ごと「古いレガシー」となってしまいます。</p>

<p>注意して欲しい点として、UNIX標準に合わせたところで、「古いレガシー」が消えてなくなるわけではないことです。<br />
Windows環境では、今でもShift_JISのテキストが現役であり、大量のレガシーデータとして健在であるように、これまで20年近く作成されてきた「BOM付きUTF-8テキストとCRLF改行」は、丸ごと新たな「古いレガシー」として、全てのWindows環境に横たわります。<br />
ITエンジニアは、「Shift_JISテキスト」「BOM付きUTF-16LEテキスト」に加えて「BOM付きUTF-8テキスト」と「CR・LFの改行」のお守りをしなければならなくなります。</p>

<p>現在でも、Excel が Shift_JISのCSV を吐き出し続けるように、UNIX標準をMicrosoftが採用したとしても、古いアプリや互換性を重視する多数のアプリや業務システムが、「BOM付きUTF-8テキスト」と「CR・LFの改行」を10年以上は吐き出し続けることになるでしょう。</p>

<p>Windowsユーザーの大多数は文字エンコーディングやBOMの問題など理解しようともしません。<br />
Shift_JISからUTF-8-BOMへ、そしてUTF-8-BOM-CRLFからUTF-8-LFへ、と二段構えでのテキスト規格変更が行われれば、Windowsしか使わないユーザーの間でも、テキスト規格に関連するトラブルが続出することは避けられないと思われます。</p>

<p>現在のMicrosoftは、テキスト規格の方針を明確にしていません。<br />
今の「BOM無しUTF-8テキストLF改行」の受け入れ方は、非常に中途半端な姿勢に見えます。<br />
今は中途半端ですが、将来は十中八九でUNIX標準テキストが採用されると思います。<br />
それがいつになるのかは、分かりませんが、十年もかからないでしょう。</p>

<p>CR改行の古いMacは、もう存在しません。<br />
ITの合理性から考えて、現代のUTF-8テキストの「BOMとCR」は邪魔な代物なので、MicrosoftがUNIX標準に合わせるのは、時間の問題でしょう。</p>

<p>一応、将来のその事態に備えておいた方が良いかも知れません。</p>]]></content><author><name>snow-stack</name></author><category term="文字エンコーディング" /><category term="Character Encoding" /><category term="Shift_JIS" /><category term="UTF-8" /><category term="BOM" /><category term="改行コード" /><summary type="html"><![CDATA[以前の記事で、日本社会全般の視点で日本語文字エンコーディングの新旧混在問題を解説しました。]]></summary></entry><entry><title type="html">「文字化け」はなぜ終わらない？ 日本のITを縛る文字エンコーディングの深い闇</title><link href="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/01/12/%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91-%E3%81%AF%E3%81%AA%E3%81%9C%E7%B5%82%E3%82%8F%E3%82%89%E3%81%AA%E3%81%84-%E6%97%A5%E6%9C%AC%E3%81%AEIT%E3%82%92%E7%B8%9B%E3%82%8B%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%B7%B1%E3%81%84%E9%97%87.html" rel="alternate" type="text/html" title="「文字化け」はなぜ終わらない？ 日本のITを縛る文字エンコーディングの深い闇" /><published>2026-01-12T00:00:00+00:00</published><updated>2026-01-12T00:00:00+00:00</updated><id>https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/01/12/%E3%80%8C%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%80%8D%E3%81%AF%E3%81%AA%E3%81%9C%E7%B5%82%E3%82%8F%E3%82%89%E3%81%AA%E3%81%84%EF%BC%9F%20%E6%97%A5%E6%9C%AC%E3%81%AEIT%E3%82%92%E7%B8%9B%E3%82%8B%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%B7%B1%E3%81%84%E9%97%87</id><content type="html" xml:base="https://snow-stack.net/%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/2026/01/12/%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91-%E3%81%AF%E3%81%AA%E3%81%9C%E7%B5%82%E3%82%8F%E3%82%89%E3%81%AA%E3%81%84-%E6%97%A5%E6%9C%AC%E3%81%AEIT%E3%82%92%E7%B8%9B%E3%82%8B%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%B7%B1%E3%81%84%E9%97%87.html"><![CDATA[<h2 id="問題の概要">問題の概要</h2>

<p>普通のPCユーザーでもExcelでCSVファイルを扱う時「文字化け」を経験したことがあると思います。<br />
この「文字化け」は、Excelが古い文字コードと新しい文字コードを両方扱えるよう作られているが故に起きる不幸と言えます。<br />
Mac や Linux が古い文字コード（レガシーデータ）を切り捨ててきたのに対し、互換性とユーザー資産の維持を重視するMicrosoft社は、古い文字コードを使える環境を温存したまま、新しい文字コードを導入しました。<br />
そのため、Windowsユーザーは古い文字コードと、新しい文字コードを、間違えないように注意して使い分ける必要があるのです。</p>

<p>古い文字コードの問題は、Windows環境だけの問題ではありません。<br />
政府や自治体には、膨大な量の「古い文字コードのデータ」が存在します。<br />
日本中の病院など医療機関にも古くから存在する電子カルテなど「古い文字コードのデータ」が存在します。<br />
これらは、データ量が膨大である上に、個人を特定する高い精度が求められるため、現実的な時間の中で「古い文字コードのデータ」を「新しい文字コード」へ変換できません。</p>

<p>また、組み込み機器に搭載される軽量級プロセッサやメモリの中では、メモリ効率の高い「古い文字コード」を使う方が、今でも合理的である側面があり、組み込みソフトウェアの世界では依然として「古い文字コード」が主流です。</p>

<p>これら「古い文字コード」は日本国内でしか使用できないため、グローバル化の障害になることにより、行政のデジタル化と民間のデジタル・トランスフォーメーション（DX）の足かせとなってしまいます。</p>

<h2 id="日本語文字エンコーディングの簡単な解説">日本語文字エンコーディングの簡単な解説</h2>

<h3 id="文字エンコーディングとは">文字エンコーディングとは</h3>

<p>「文字コード」という言葉を使用しましたが、情報技術の世界では「文字エンコーディング」という呼び方が正しい表現です。<br />
本来、コンピュータは計算機であり、数値を扱う事を本分とする機械です。<br />
文字を扱うには「文字を番号に置き換えて扱う」必要があります。<br />
「文字を番号に置き換える」には、「文字の並び順」をまず定めて、その「並び順」を具体的にコンピュータが扱う「数値」に割り当てる必要があります。<br />
「文字の並び順」を定めたものを「コードポイント」日本語では「(符号化) 文字集合」と呼び、その「コードポイント」を、具体的な「数値」に割り当てたものを、「文字エンコーディング」と呼び、日本語では「(文字) 符号化方式」と呼びます。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">俗称(英語)</th>
      <th style="text-align: left">技術用語</th>
      <th style="text-align: left">解説</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">コードポイント（Code Point）</td>
      <td style="text-align: left">(符号化) 文字集合</td>
      <td style="text-align: left">文字の並び順を定めたもの</td>
    </tr>
    <tr>
      <td style="text-align: left">文字エンコーディング (Character Encoding)</td>
      <td style="text-align: left">(文字) 符号化方式</td>
      <td style="text-align: left">コンピュータが扱う具体的な「数値」に割り当てたもの</td>
    </tr>
  </tbody>
</table>

<p>このコードポイントと文字エンコーディングの違いは、先の「新しい文字コード」にしか存在しません。<br />
「古い文字コード」では、文字の並び順がそのまま具体的な文字番号に割り当てられています。<br />
しかし、現代では「古い文字コード」も「文字エンコーディングの一種」として扱われます。</p>

<h2 id="歴史的経緯">歴史的経緯</h2>

<h3 id="asciiコードとは">ASCIIコードとは</h3>

<p>ASCII（American Standard Code for Information Interchange）は、1963年にアメリカで策定された文字コードです。7ビットで128文字を表現し、英数字、記号、制御文字を定義しています。</p>

<h4 id="asciiの構成">ASCIIの構成</h4>

<p>0〜31番と127番は制御文字です。改行（LF: 10）、キャリッジリターン（CR: 13）、タブ（HT: 9）など、画面に表示されない制御用の文字が割り当てられています。</p>

<p>32番はスペース、33〜126番が印字可能文字です。48〜57に数字の0〜9、65〜90に大文字A〜Z、97〜122に小文字a〜zが配置されています。この配置には意味があり、大文字と小文字は32の差で対応しているため、ビット演算で大文字小文字変換ができます。</p>

<h4 id="asciiの限界と拡張">ASCIIの限界と拡張</h4>

<p>7ビット128文字という設計は、英語圏では十分でしたが、それ以外の言語には全く足りませんでした。そこで8ビット目を使った拡張が各地で行われます。128〜255番の領域に、ヨーロッパではアクセント付き文字を、日本では半角カナを割り当てました。</p>

<h3 id="日本語文字エンコーディングの開発">日本語文字エンコーディングの開発</h3>

<p>日本の文字エンコーディングの歴史は、コンピュータで日本語を扱うための試行錯誤の連続でした。</p>

<h3 id="jisコードの登場1978年">JISコードの登場（1978年）</h3>

<p>最初の標準化は <strong>JIS C 6226</strong>（後のJIS X 0208）です。漢字約6,000字とひらがな・カタカナを定義しましたが、これは文字の「集合」を決めただけで、実際にバイト列としてどう表現するかは別問題でした。</p>

<h3 id="三つ巴の時代198090年代">三つ巴の時代（1980〜90年代）</h3>

<p>ここから日本特有の混乱が始まります。</p>

<p><strong>Shift_JIS</strong> は、マイクロソフトとアスキーが開発し、MS-DOSやWindowsで標準となりました。1バイトのASCII/半角カナと2バイトの漢字を混在できる設計が特徴です。</p>

<p><strong>EUC-JP</strong> は、UNIX系システムで採用されました。Shift_JISとは互換性がなく、同じ「あ」でも全く違うバイト列になります。</p>

<p><strong>ISO-2022-JP</strong>（通称JISコード）は、電子メールの標準として使われました。エスケープシーケンスで文字集合を切り替える方式です。</p>

<p>この時代、「文字化け」は日常茶飯事でした。Windowsで作ったファイルをUNIXで開くと化ける、メールの添付ファイルが読めない、といった問題が頻発しました。</p>

<h3 id="unicodeによる統一2000年代">Unicodeによる統一（2000年代〜）</h3>

<p>UTF-8の普及により状況は大きく改善されました。Webでは2008年頃にUTF-8がShift_JISを逆転し、現在ではほぼ100%がUTF-8です。</p>

<p>ただし、日本のレガシーシステムには今もShift_JISが残っています。官公庁のシステムや古い業務アプリケーションでは、依然としてShift_JISが現役で、CSVファイルをExcelで開くためにあえてShift_JISで出力する、といった対応も珍しくありません。</p>

<h2 id="米国と日本の文字エンコーディングの関係">米国と日本の文字エンコーディングの関係</h2>

<h3 id="asciiと日本語エンコーディングの関係">ASCIIと日本語エンコーディングの関係</h3>

<p>日本語の文字コードはすべてASCIIとの互換性を意識して設計されています。これは、既存の英語ベースのシステムやプロトコルとの共存が必須だったからです。</p>

<h3 id="shift_jisの設計思想">Shift_JISの設計思想</h3>

<p>Shift_JISは、ASCIIの0〜127番をそのまま保持しています。2バイト文字の1バイト目には129〜159、224〜239という「ASCIIと重ならない」範囲を使いました。</p>

<p>ただし落とし穴があります。2バイト目には64〜126という範囲も使うため、バックスラッシュ（\、92番）やチルダ（~、126番）と衝突します。例えば、「表」「能」「ソ」などの漢字の2バイト目が、偶然にもバックスラッシュと同じ値（92）になってしまうケースがあり、これがファイルパスなどで予期せぬエラーを引き起こしました。</p>

<p>これらの文字がファイルパスやエスケープ処理で問題を起こしました。いわゆる「ダメ文字」問題です。</p>

<h3 id="euc-jpの設計思想">EUC-JPの設計思想</h3>

<p>EUC-JPはより慎重な設計で、日本語文字はすべて128以上のバイトのみで構成されます。そのためASCII領域との衝突は起きませんが、半角カナの扱いが複雑になりました。</p>

<h3 id="utf-8の巧妙さ">UTF-8の巧妙さ</h3>

<p>UTF-8はASCII互換性を最優先に設計されています。ASCIIの128文字はそのまま1バイトで表現され、既存のASCIIテキストは一切変更なしにUTF-8として有効です。</p>

<p>マルチバイト文字の先頭バイトは必ず192以上、継続バイトは128〜191という規則があり、どのバイトを見ても「ASCII」「先頭」「継続」が判別できます。これによりShift_JISのような「ダメ文字」問題は原理的に発生しません。</p>

<h2 id="新旧文字エンコーディングとは">新旧文字エンコーディングとは</h2>

<p>先の解説にある「古い文字コード」とは、主に Shift_JIS を意味します。<br />
広義には、EUC-JP と JISコード も「古い文字コード」に含まれますが、現在ではほとんど消滅しています。<br />
Shift_JIS だけが現在でも使用される「古い文字コード」に該当します。<br />
「新しい文字コード」とは、Unicode (ユニコード) の事を示し、PC上では主に UTF-8 が使用されています。<br />
また、ソフトウェアの内部では、UTF-16 が多く活用されています。<br />
Windowsの内部ではUTF-16LEが使用され、Javaの内部やPDFではUTF-16BEが使用されます。</p>

<p>この場合、<strong>Unicode (ユニコード)</strong> が <strong>コードポイント(文字集合)</strong> を示し、<br />
<strong>UTF-8 と UTF-16LE と UTF-16BE</strong> が <strong>文字エンコーディング (符号化方式)</strong>  を示します。</p>

<h2 id="もう一つの類似問題改行コードの違い">もう一つの類似問題：改行コードの違い</h2>

<p>文字エンコーディングの問題とは次元の異なる問題ですが、<br />
日本のITエンジニアが悩まされる類似問題に「Windows と LinuxOS &amp; MacOS での改行コードの違い」があります。<br />
これは文字エンコーディングとは異なり日本だけの問題では無く、世界的な問題であり、<strong>技術的には文字エンコーディング問題とは別次元</strong>で対策すべき課題です。</p>

<p>しかし、日本の<strong>実務の現場</strong>では文字エンコーディング問題と改行コード問題は<strong>セットで覚えるべき問題</strong>となります。</p>

<h2 id="現在の文字エンコーディング利用状況">現在の文字エンコーディング利用状況</h2>

<p>ネットワークトラフィックの90%が、UTF-8と言われています。<br />
LinuxOS と Apple社製品、そして Android など Google製品は完全に UTF-8 で統一されています。<br />
しかし、先に説明したように Microsoftの Windows は過去のユーザーのShift_JISデータ資産が膨大なため、今でもShift_JISを扱える機構を多数残しています。<br />
特に Excel などMicrosoft Office データには、今からではUTF-8にコンバージョンすることが不可能なほど膨大なShift_JISのデータ資産があり、Shift_JISを扱える機構を削除することは、不可能に近い状況と思われます。</p>

<p>PC環境だけではなく、銀行や政府や自治体の扱う古いデータ資産も気が遠くなるほど膨大なShift_JISデータを抱えています。<br />
病院など医療機関も同様で、さらに電子カルテなどの情報は、個々人を取り違えると患者の命に関わるため、個人情報の正確さが強く求められる分野です。<br />
ここで Shift_JIS から UTF-8 への文字エンコーディング変換で、一部でも「文字化け」する事が許されない分野です。</p>

<p>これらは、現実的には Shift_JIS から UTF-8 への文字エンコーディング変換を現実的な時間の内には、実現できないと考えるのが妥当です。</p>

<p>家電などの組み込みソフトウェアの分野でも、全ての文字が2バイト以内で済むメモリ効率の良さから、 Shift_JIS が積極的に選択されています。</p>

<h2 id="shift-jisの障害と優位性と必然性">Shift-JISの障害と優位性と必然性</h2>

<h3 id="shift_jis-の障害と限界">Shift_JIS の障害と限界</h3>

<p>Shift_JIS は先頭から全て評価しなければ、正しく日本語文字を判別できない欠点があります。<br />
データ通信などで、文字列が分断されて送信されたとき、Shift_JIS ではバラバラのパケットを全て受け取って結合した上で、先頭からバイト列を読み取らなければ、文字コードを読み取れません。</p>

<p>UTF-8 や UTF-16 は、その部分が良く考えて設計されており、分断された文字列も、文字列の途中から正しく文字コードを読み取れるように作られています。</p>

<p>Shift_JIS は扱える文字の種類にも制限が多く、全体で 11,391文字しか扱えません。<br />
Unicode の UTF-8 や UTF-16 は、最大 1,112,064 文字が扱えます。世界中の文字を扱える設計なので、文字空間が広大になっています。バイト数が多いのもそのせいです。</p>

<h3 id="shift_jis-の優位性">Shift_JIS の優位性</h3>

<p>Shift_JIS と EUC-JP は、英数字はASCIIコードと同じで1バイト、日本語でも全て2バイトで表せます。<br />
この「古い文字コード」は非常にメモリ効率が良く、必ず1バイトか2バイト単位で検索できるので、検索効率も良いです。</p>

<p>UTF-8 では英数字は1バイト、日本語は多く場合 3バイト、サロゲートペアを含むと4バイトの文字も現れます。メモリ制約の大きい組み込みソフトウェアの世界では、UTF-8 のメモリ効率の悪さは無視できません。</p>

<p>UTF-16 においては、大半の文字は2バイトで表せますが、サロゲートペアを含むと4バイトの文字も現れます。<br />
UTF-16 は必ず2バイトか4バイトのどちらかなので検索がやり易く、OSやデータベースやファイルシステムの内部実装には UTF-16 が採用されることが多いです。<br />
しかし、やはり UTF-8 と同様に最大4バイトになる場合があり、全て2バイトに収まる Shift_JIS にはメモリ効率で劣ります。</p>

<h2 id="utf-8時代にも引きずるshift-jisの経路依存性">UTF-8時代にも引きずるShift-JISの経路依存性</h2>

<p>経路依存性（Path Dependence）とは、過去の歴史的経緯や初期の選択が、現在の状況や将来の選択肢に強い影響を与え続け、時に非効率な状態でもその慣習や仕組みから抜け出せなくなる現象です。<br />
日本語の文字エンコーディングが、Shift-JIS が広く使われるようになってから、UTF-8 へ移り変わったことにより、さまざまな経路依存性の障害が残っています。</p>

<h3 id="bom付きutf-8問題">BOM付きUTF-8問題</h3>

<p>Excel の CSVファイルの扱いが代表的ですが、Windows環境においてはユーザーが Shift_JIS データを大量にデータ資産として保有していることから、Microsoft社は過去のユーザー資産を守る観点から、Shift_JISデータとUTF-8データを共存できる環境を構築しています。<br />
Shift_JISとUTF-8を共存する為には、両者を明確に区別できなければなりません。<br />
Windowsでは、テキストファイルを扱う場合、UTF-8テキストの先頭には、BOM(Byte Order Mark)という3バイトの識別コードを付ける事を義務づけています。<br />
先頭にBOMが無ければ、そのテキストファイルは Shift_JIS のテキストファイルと解釈されます。<br />
もし、Excel で 先頭にBOMの付いていない UTF-8 の CSVファイルを読み込むと、Shift_JIS のCSVファイルと解釈され文字化けします。<br />
公式の UTF-8 の仕様では、BOM は付けても付けなくても良く、LinuxOSやMacOS、スマホなどでは、BOMの無いUTF-8テキストが使用されています。<br />
しかし、WindowsではUTF-8テキストファイルの先頭には必ずBOMを付ける必要があります。これは、WindowsとLinuxOSやMacOSとの間でテキストファイルを交換するとき、<strong>文字化けやデータ読み込み時のエラーなど、</strong>さまざまなシステム障害を起こす要因になっています。<br />
Shift_JISとUTF-8を共存させるから、BOMが必要になるので、Shift_JISの経路依存性の問題なのです。</p>

<h3 id="shift-jisの膨大なレガシーデータ">Shift-JISの膨大なレガシーデータ</h3>

<p>Shift_JISは、Windows環境だけではなく、メインフレームや古い業務システムでも広範囲に使用されてきました。<br />
そして、銀行や製造業や医療機関や政府・自治体が数十年に渡って扱っているShift_JISデータは、膨大な量になります。<br />
それらのShift_JISデータを今から急にUTF-8に変換しようとしても、現実的な時間とコストの枠内では不可能なデータ量になります。<br />
また、正確にShift_JISデータをUTF-8に変換するには、いくつか障害があり、正確な変換は難しいのが現状です。<br />
この膨大なShift_JISデータを運用していくには、今のところ、古いデータはShift_JISのまま管理し、新しいデータだけUTF-8で扱う、二重構造のシステムにするしか術はないと考えられます。<br />
古いデータは使う時だけUTF-8に変換して閲覧し、文字化けしたら変換前のデータを閲覧できるようにするのが堅実です。</p>

<h3 id="shift-jis外字問題">Shift-JIS「外字」問題</h3>

<p>Shift_JIS を UTF-8 へ変換することの最も大きな障害になっているのが、<strong>「外字」の存在です</strong>。</p>

<p>Shift_JIS が扱える文字数は、11,391文字だけです。<br />
日本語の漢字は異体字も含めると 6万字以上あると言われ、戸籍謄本などさまざまな漢字が使用される行政の日本語環境では、Shift_JIS の扱える文字数では全く足りません。</p>

<p>「外字」とは、標準の文字集合に含まれていない文字を、ユーザーやベンダーが独自に追加したものです。Shift_JISでは、この外字のために特定のコード領域が予約されています。 <br />
Shift_JISでは、F040〜F9FC の領域がユーザー定義文字用として確保されています。ここには約1,880文字分の空きがあり、企業や自治体が独自の記号、旧字体、人名漢字などを登録して使っています。<br />
典型的な用途は、戸籍システムにおける異体字、企業ロゴや社内記号、地方自治体の地名に使われる特殊な漢字などです。</p>

<p>外字は作成した環境でしか正しく表示できません。外字を含むデータを他のシステムに持っていくと、文字化けするか「〓」や空白になります。また、検索やソートも正しく機能しません。</p>

<p>日本政府が進める「自治体システム標準化」において、最大の障壁の一つとなっているのが、各自治体が独自に運用してきた「外字（Gaiji）」の処理です。日本の戸籍制度においては、氏名や地名にJIS規格（JIS X 0208/0213）に含まれない特殊な漢字が使用されることが許容されてきました。これに対応するため、各自治体ベンダーは、システムの空き領域（外字領域）に独自のビットマップフォントやコードを割り当てて運用してきました。この結果、A市のシステムで作られたデータがB市のシステムでは全く読めない、あるいは別の文字として表示されるという、深刻な相互運用性の欠如が生じています。</p>

<p>デジタル庁およびIPA（独立行政法人情報処理推進機構）は、各自治体ごとにバラバラの外字を<strong>「MJ文字情報基盤」</strong>として統一する作業を進めています。<br />
しかし、統一できない文字が15文字にも及び、それらを「実際に戸籍で使用されている文字」などで絞り込みを行った結果、連携に必要な文字数は約6万文字、そのうち戸籍運用上必須な文字は約1万文字にまで圧縮されたそうです。<br />
この絞り込みを経て、MJ文字を拡張した文字セット<strong>「MJ+」</strong>が策定されました。戸籍副本データ管理システムでは、この「MJ+」を用いることで情報連携を行う方針だそうです。<br />
しかし、約6万文字もの巨大な文字セットを、現場の端末ですべて入力・表示・検索できるようにすることは容易ではないことです。</p>

<p>少し、整理すると、Shift_JIS のデータをUTF-8へ変換するには、まず「外字」をUTF-8で扱う規格を定めなければならず、UTF-8で扱えない「外字」に日本全国の自治体で統一された例外処理を開発して導入しなければなりません。<br />
その上、Shift_JIS のデータは政府や自治体だけでも膨大で、<strong>その正確なUTF-8への変換には</strong>、人間による目視確認がどうしても必要になります。<br />
今ならAIによる画像確認も可能かもしれませんが、単純なコンバージョン処理では済まない事は分かります。<br />
医療機関のShift_JISデータも社会保険制度の関係から、自治体データと同根の問題があり、こちらも膨大な患者情報を有します。</p>

<h3 id="shift-jisの組み込みシステムでの優位性">Shift-JISの組み込みシステムでの優位性</h3>

<p>AIの登場で、以前ほど話題に上らなくなった IoT ですが、AIとは次元の違う技術なので、依然として開発と進歩は進んでいます。<br />
IoTと深く関わるのが、組み込みソフトウェアの分野です。<br />
先に少し解説しましたが、組み込みソフトウェアでは、メモリ効率の良さから積極的に Shift_JIS を選択することが多いそうです。<br />
<strong>日本語一文字あたり Shift_JIS は 2バイト、UTF-8 は多くの場合 3バイト</strong>を消費します。これは単純計算でUTF-8がShift_JISの1.5倍の記憶領域を消費することになります。<br />
メモリ環境が乏しい組み込みソフトウェアの世界では、少しでもメモリ消費の少ない Shift_JIS を使うことも当然の選択と言えます。<br />
また、ほぼ2バイト固定長に近い Shift_JIS の文字列は検索処理が単純になり、演算処理は軽量になるのに対し、UTF-8 はバイト数が可変長(一文字、1バイトから4バイトまで4種類の可変長)なので、演算処理が重くなり検索処理には向いていません。<br />
Windowsでも内部処理は、UTF-16LE を使用しています。<br />
組み込みの世界で将来、Unicodeを使用することになっても、エンコーディングは UTF-16 を使用するでしょう。</p>

<p>フォントレンダリングの問題もあります。<br />
現在のPCやスマホ環境では、アウトラインフォントが主流であり、外字や異体字を扱うために必要な技術です。UTF-8 の採用はアウトラインフォントの利用を前提にすることになります。<br />
しかし、組み込みソフトでは外字や異体字を扱う必然性はない。炊飯器や石油ストーブやPOS端末の液晶パネルに複雑な旧字や異体字を表示する必然性はありません。<br />
つまり、アウトラインフォントを使う必然性がないのです。<br />
むしろ演算処理が重くメモリ効率も最悪のアウトラインフォントなどは、無駄なコンピュータリソースの浪費でしかありません。<br />
組み込みでは Shift_JIS の文字集合(並び順)に対応したビットマップフォントが主流であり、このリソース効率の良いビットマップフォントが使えるのも Shift_JIS の魅力の一つと言えます。</p>

<p>整理すると、組み込みや IoT の世界では、Shift_JIS は非常に優れたソリューションと言え、UTF-8 は将来 IoT 機器などがクラウドなどに直接アクセスするようにならない限り、現状では必然性のあるものではないと言えます。<br />
また、全ての組み込み機器がネットワークやクラウドにアクセスするのか、と問われると、個人的には「繋がらない権利」も必要になる気がします。</p>

<p>将来を見ても IoT機器は、製品によっては、どんどん小さくなる方向へ発展する可能性のある製品群なので、メモリや演算リソースが乏しい条件は変わらない気がします。</p>

<h3 id="shift-jisは完全には放棄できない">Shift-JISは完全には放棄できない</h3>

<p>Excel で扱うCSVファイルなど、Windows 環境における膨大な過去の Shift_JISデータの蓄積。<br />
政府・自治体・医療機関の抱える膨大な過去の Shift_JISデータ。<br />
組み込みソフトウェアや IoT機器の開発における Shift_JIS のコンピュータ・リソース節約の優位性。</p>

<p>これらを統合して考えた場合、全ての文字エンコーディングを Unicode (UTF-8, UTF-16) に置き換えるのは、ほぼ不可能に近いと思われます。</p>

<p>もちろん、可能な限りUnicode へ転換すべきなのは間違いありません。<br />
例えば、政府や自治体はグローバル化への対応のために、Unicode 対応が必須です。<br />
特定技能の外国人労働者などに住民票を発行する場合、その外国人の名前をデジタル登録できなければ、受け入れに支障を来します。<br />
それは、Unicode を使用しなければ不可能です。<br />
医療や介護の分野でも、外国人看護師や外国人介護士は絶対に必要です。<br />
組み込みソフトウェアの分野でも、 IoT機器はネットワークに接続して、UTF-8 の REST-APIなどにアクセスする必要があります。<br />
この場合は、IoT機器側で UTF-8 か UTF-16 のエンコード処理が必要になるかも知れません。</p>

<p>Unicode 対応が必要であることは、間違い無いのです。<br />
しかし、現実には全ての文字エンコーディングを Unicode にする事は難しいことが、これまでの解説で理解できると思います。</p>

<h2 id="2025年の崖と文字エンコーディング問題">「2025年の崖」と文字エンコーディング問題</h2>

<p>2025年現在、日本国内におけるShift_JIS（以下SJIS）データは、ウェブの世界ではほぼ絶滅（シェア0.1%未満）している一方で、<strong>「企業の基幹システム」「金融・行政の内部データ」「Excel主体の現場」</strong>という3つの領域において、依然として膨大な量のレガシーデータが残存しています。<br />
そのデータ量は、数ペタバイト級、あるいはそれ以上の規模で静かに眠り、また流通し続けています。</p>

<p>経産省のDXレポートでは、2025年を境にレガシーシステムが技術的負債として日本企業全体で12兆円の負担となり、AIなど新規の「攻めの投資」を毀損すると予言しましたが、ほぼ的中していると思います。<br />
数ペタバイト級の膨大なSJISデータをUnicodeに変換するだけでも大変な労力とコストがかかります。<br />
ここに42万人かそれ以上のITエンジニア不足が重なっています。これもDXレポートで予言されていた通りです。<br />
そもそもシステム内部がブラックボックス化していてマイグレーションすらできなくなっています。<br />
NTTデータやSCCKなどがAIを活用したレガシーシステムのマイグレーションサービスをこれから提供するという報道がありましたが、これからマイグレーションサービスを提供するということは、現時点でマイグレーションできていない証拠でもあります。</p>

<p>数ペタバイト級の膨大なSJISデータの存在は、「2025年の崖」を裏付ける<strong>「数ある原因の一つ」</strong>でもあります。</p>

<p>クラウドやWebの世界だけしか触れていないと、SJISデータの問題は体感できないと思いますが、日本社会のDX推進において、無視できない大きな障害の一つであることは、ITに関わる全ての人々が常識として認識しておくべき社会問題だと思います。</p>

<p>以上、日本特有のレガシーシステムと文字エンコーディングの問題についての解説でした。</p>

<h2 id="関連資料">関連資料</h2>

<p><a href="https://qiita.com/GeneLab_999/items/6bbd581994cd7a55813b">あなたのCSVが会社を潰す日 〜非エンジニアが知らずにやらかすWindowsの罠〜</a></p>

<p><a href="https://www.digital.go.jp/policies/local_governments/specification">地方公共団体情報システムデータ要件・連携要件標準仕様書</a></p>

<p><a href="https://www.ipa.go.jp/digital/chousa/dx-trend/dx-trend-2025.html">「DX動向2025」日米独比較で探る成果創出の方向性「内向き・部分最適」から「外向き・全体最適」へ</a></p>]]></content><author><name>snow-stack</name></author><category term="文字エンコーディング" /><category term="Character Encoding" /><category term="Shift_JIS" /><category term="UTF-8" /><summary type="html"><![CDATA[問題の概要]]></summary></entry><entry><title type="html">雪塚はじめました</title><link href="https://snow-stack.net/2026/01/06/%E3%82%B5%E3%82%A4%E3%83%88%E9%96%8B%E5%A7%8B%E3%81%AE%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B.html" rel="alternate" type="text/html" title="雪塚はじめました" /><published>2026-01-06T00:00:00+00:00</published><updated>2026-01-06T00:00:00+00:00</updated><id>https://snow-stack.net/2026/01/06/%E3%82%B5%E3%82%A4%E3%83%88%E9%96%8B%E5%A7%8B%E3%81%AE%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B</id><content type="html" xml:base="https://snow-stack.net/2026/01/06/%E3%82%B5%E3%82%A4%E3%83%88%E9%96%8B%E5%A7%8B%E3%81%AE%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B.html"><![CDATA[<h2 id="web-サイト-始めます">Web サイト 始めます</h2>

<p>新規Webサイトの snow-stack.net を始めました。
このサイトは GitHub Pages で作成しています。</p>

<p>以前、GitHub Pages 以外のレンタルサーバーで Wordpress のWebサイトを運営していましたが、いろいろ事情がありまして、そのWebサイトは閉鎖しました。</p>

<p>そのWebサイトでは、技術記事や政治経済や業界評論などランダムなテーマの記事を書いていて、方向性や一貫性が定まらずバラバラな内容のサイトになってしまっていました。</p>

<p>Webサイトの内容をどう修正しても、収拾が付かない状況だったので、一度閉鎖することにしたのです。</p>

<p>理由は、他にもいろいろありますが、ここで説明する必要は無いと思っています。</p>

<p>ただ、そのWebサイトでは技術記事なども書いていまして、自分でも必要な覚え書きのような記事もありました。</p>

<p>正直、自分でもサイトを閉鎖した事で不便になってしまっている側面もありまして、その技術記事の部分だけ、こちらで復活しようと思っています。</p>

<p>また、GitHub で公開していた僅かなソースコードやツールなども、こちらで公開し直そうと思っています。</p>

<p>技術系の記事は、今後は全てこの snow-stack.net に書いて行くつもりです。</p>

<p>以前の経験から、技術系記事は商売や集客には向いていない事が分かっているので、商業目的では書きません。</p>

<p>商売は、別のWebサイトで始めようと思っています。ここでは行いません。</p>

<p>政治経済や業界評論なども別の場所で行おうと思っています。</p>

<h2 id="衰退する技術知識系サイト">衰退する技術知識系サイト</h2>

<p>生成AIの台頭による stack overflow の急激な衰退に見られるように、技術系記事はネット上での存在価値を失いつつあります。
技術的に分からないことがあれば、生成AIに質問した方が早いからです。
私も分からないことがあれば、生成AIに質問します。いちいち検索しません。</p>

<p>よって、このサイトもほぼ検索される事を期待していません。</p>

<p>ただ、いまのところは、生成AIの回答は断片的な知識の提供には便利ですが、ある程度まとまった知識を獲得する手段としては、いちいちチャットと会話しなければならない点で、不便なところがあります。</p>

<p>ここでは、そういう「チャットと会話していると不便」なタイプの知識を、提供していきたいと思います。</p>

<p>自分でも、いちいちAIに質問するには、不便な知識というものがあるので、そういうものをここにメモして起きたいと思っています。</p>

<p>ネットに書いた知識は、どうせ生成AIの餌になってしまうので、集客などの商業目的での効果は期待していません。</p>

<p>「チャットと会話していると不便」なタイプの知識も、いずれ生成AIの進歩で、価値を失うときは来るでしょう。</p>

<p>そのときは、GitHub で広めたいツールなどを公開し、その解説などをここでやろうと思ってます。</p>

<p>ここは、完全に私の個人的な「庭」であり「遊び場」です。</p>

<p>ここを訪れる人は、そのように理解してください。</p>]]></content><author><name>snow-stack</name></author><summary type="html"><![CDATA[Web サイト 始めます 新規Webサイトの snow-stack.net を始めました。 このサイトは GitHub Pages で作成しています。 以前、GitHub Pages 以外のレンタルサーバーで Wordpress のWebサイトを運営していましたが、いろいろ事情がありまして、そのWebサイトは閉鎖しました。 そのWebサイトでは、技術記事や政治経済や業界評論などランダムなテーマの記事を書いていて、方向性や一貫性が定まらずバラバラな内容のサイトになってしまっていました。 Webサイトの内容をどう修正しても、収拾が付かない状況だったので、一度閉鎖することにしたのです。 理由は、他にもいろいろありますが、ここで説明する必要は無いと思っています。 ただ、そのWebサイトでは技術記事なども書いていまして、自分でも必要な覚え書きのような記事もありました。 正直、自分でもサイトを閉鎖した事で不便になってしまっている側面もありまして、その技術記事の部分だけ、こちらで復活しようと思っています。 また、GitHub で公開していた僅かなソースコードやツールなども、こちらで公開し直そうと思っています。 技術系の記事は、今後は全てこの snow-stack.net に書いて行くつもりです。 以前の経験から、技術系記事は商売や集客には向いていない事が分かっているので、商業目的では書きません。 商売は、別のWebサイトで始めようと思っています。ここでは行いません。 政治経済や業界評論なども別の場所で行おうと思っています。 衰退する技術知識系サイト 生成AIの台頭による stack overflow の急激な衰退に見られるように、技術系記事はネット上での存在価値を失いつつあります。 技術的に分からないことがあれば、生成AIに質問した方が早いからです。 私も分からないことがあれば、生成AIに質問します。いちいち検索しません。 よって、このサイトもほぼ検索される事を期待していません。 ただ、いまのところは、生成AIの回答は断片的な知識の提供には便利ですが、ある程度まとまった知識を獲得する手段としては、いちいちチャットと会話しなければならない点で、不便なところがあります。 ここでは、そういう「チャットと会話していると不便」なタイプの知識を、提供していきたいと思います。 自分でも、いちいちAIに質問するには、不便な知識というものがあるので、そういうものをここにメモして起きたいと思っています。 ネットに書いた知識は、どうせ生成AIの餌になってしまうので、集客などの商業目的での効果は期待していません。 「チャットと会話していると不便」なタイプの知識も、いずれ生成AIの進歩で、価値を失うときは来るでしょう。 そのときは、GitHub で広めたいツールなどを公開し、その解説などをここでやろうと思ってます。 ここは、完全に私の個人的な「庭」であり「遊び場」です。 ここを訪れる人は、そのように理解してください。]]></summary></entry></feed>