KENTEM TechBlog

建設業のDXを実現するKENTEMの技術ブログです。

Shift_JISファイルを文字化けなしでUTF-8に変換する小技

この記事は、 KENTEM TechBlog アドベントカレンダー2025 10日目、12月10日の記事です。

こんにちは、KENTEM4年目のY.Tです。

突然ですが皆さん、Shift_JISとUTF-8のエンコードの違いに苦しめられたことはありますか?

特にWindowsで開発をしている方だと、こんな経験があるのではないでしょうか。

  • Visual Studioでコードを書いてコミットしようとしたら、日本語コメントが文字化けしていた

  • Visual Studioでコードを書いてVS Codeで開いたら文字化けしていた

今回は、そんなときにサクッと問題を解決できる小技を見つけたのでご紹介します。

Shift_JISファイルをUTF-8に変換する小技

以下の手順で、日本語コメントを保ったまま Shift_JIS から UTF-8 に変換することができます。

  1. Visual Studio と VS Code で同じファイルを同時に開く

  2. Visual Studio 側で全選択&コピー(Ctrl + A → Ctrl + C)

  3. VS Code 側で全貼り付け(Ctrl + A → Ctrl + V)

  4. VS Code で上書き保存(Ctrl + S)

この操作をすると、なぜか文字化けがきれいに直っています

「とりあえず直ればOK!」という方はここまでで十分です。

「なんでこれで直るの?」が気になる方は、もう少しだけお付き合いください。

ざっくり解説:変換の仕組み

今回の操作で起きた流れをざっくり書くと、こうなっています。

  • 今回のケースの初期状態では、Visual Studio はShift_JIS*1で保存されたファイルを正しくデコードして表示している

  • その状態でコピーすると、Windowsのクリップボードはテキストを UTF-16 などの複数形式で保持する

  • VS Code に貼り付けた時は、保持したデータの中から UTF-16 のテキストを受け取り、自身の内部文字列(UTF-16)として扱う*2

  • 保存時にVS Code は規定エンコーディング(デフォルト: UTF-8)でファイルに書き出す

つまり、

Shift_JIS → UTF-16(クリップボード)→ UTF-8(VS Code 保存)

という変換パイプラインが、コピペ一発で勝手に走ってくれるというのが今回の小技の仕組みです。

詳細解説:クリップボードとエンコーディング

ここからは、仕組みの話をもう少しだけ深堀りしてみます。

Point①:Windowsのクリップボードは「複数フォーマットで」テキストを保持する

Windows のクリップボードは、テキストをコピーしたときに 1種類ではなく、複数の形式で同時に保存できます。

  • コピー元アプリは、複数のフォーマットをクリップボードに登録する

  • 貼り付け先アプリは、その中から「自分が扱える形式」を選んで取り出す

という仕組みです。

たとえば Excel のセルをコピーした場合、クリップボードには

  • CF_UNICODETEXT(タブ区切りテキスト)

  • HTML Format<table> を含む HTML)

  • Rich Text Format(RTF)

  • CSV

  • Excel独自のバイナリ形式(Biff8)

など、複数のフォーマットが登録されます。

このため・・・

  • Teams に貼る → HTML Format を読み込み、表として表示

  • メモ帳に貼る → CF_UNICODETEXT を読み込み、タブ区切りテキストとして表示

という違いが出ます。

貼り付け先ごとに「どのフォーマットを採用するか」が違うためです。

Point②: Visual Studio のデフォルトはShift_JIS系

Visual Studioの日本語環境での既定値はほとんどの場合で

Japanese (Shift_JIS) - Code page 932

になっています。*3

つまり、何も設定せずに新規ファイルを作るとShift_JIS 系(CP932)で保存されるケースが多いです。

もちろん、後述するように EditorConfig や Visual Studio のオプション設定で、 プロジェクトとして UTF-8 を既定にすることは可能です。

Point③:VS Code のデフォルトは UTF-8

一方、VS Code の既定エンコーディングは UTF-8(BOM なし) です。

設定で files.encoding を変えない限り

  • ファイルを開くときも
  • 保存するときも

基本的には UTF-8前提で動きます。

ここで、中身は Shift_JIS(CP932)のバイト列なのに

VS Code が「これは UTF-8 だろう」と思い込んで読んでしまうと、同じバイト列をまったく別の文字コードとして解釈することになるので文字化けします。

コピペで何が起きているかを時系列で整理

改めて、今回の「小技」で起きていることを時系列順に並べてみます。

①ファイル生成

→ 外部ツールやエディタが CP932 / Shift_JIS 系でファイルを書き出す

②Visual Studio で開く

→ Visual Studio はファイルを CP932 として読み込み、正しい UTF-16 文字列としてメモリ上に展開する

③ Visual Studio からコピー

→ ユーザーが Ctrl + A / Ctrl + C を押すと、Visual Studio はその文字列を少なくとも CF_UNICODETEXT(UTF-16 テキスト)としてクリップボードへ登録する

④ VS Code に貼り付け

→ VS Code はクリップボードから CF_UNICODETEXT を読み取り、内部の文字列バッファ(UTF-16)として保持する

⑤ VS Code で保存

files.encoding = "utf8" などの設定に従って内部の UTF-16 文字列を UTF-8 のバイト列に変換して保存する

上記の結果として、ファイルの中身が 「Shift_JIS 系のバイト列」 → 「UTF-8 のバイト列」 に永続的に置き換わるので、以降は VS Code で開いても文字化けしなくなります。

そもそも、文字化けを「防ぐ」には?

今回ご紹介したお手軽コピペ小技は、すでに

  • Shift_JIS でファイルが作られてしまった
  • でも今は UTF-8 で統一したい

といった状況での応急処置としては便利です。 とはいえ、本質的には「そもそも文字化けさせない」ほうがいいですよね。

プロジェクトとして「UTF-8で統一する」と決めているなら、 最初から全部 UTF-8 になるようにエディタ側の設定を揃えておくのがおすすめです。

① VS Code 側で files.encoding を確認する

VS Code のデフォルトは UTF-8 ですが、一応設定を確認しておくと安心です。

settings.jsonの例

{
  "files.encoding": "utf8"
}

ステータスバー右下のエンコーディング表示(例:「UTF-8」「Shift_JIS」など)からも変更できます。

② Visual Studio 側で「既定エンコーディング」を UTF-8 に

Visual Studio 2022(17.13 以降)では、「保存時の既定ファイルエンコーディング」を変更するオプションが追加されています。

日本語環境ではデフォルトが Japanese (Shift_JIS) なので、

  • 新規ファイルも含めて、基本 UTF-8 にしたい
  • チームとして「これからは UTF-8 でいきたい」

という場合は、この既定値を UTF-8 に切り替えておくと安全です。

(具体的な場所は ToolsOptionsEnvironmentDocuments あたりにあります。)

③ EditorConfig で「UTF-8統一」をプロジェクトルールにする

Visual Studio と VS Code の両方で開発している場合は、 .editorconfigcharset を明示しておくのが一番安心です。

例えば、プロジェクトルートにこんな .editorconfig を置いておきます

# プロジェクトルートの .editorconfig
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true

[*.cs]
indent_style = space
indent_size  = 4

ポイントは以下の2つです。

  • charset = utf-8 で、ファイルの文字コードを UTF-8 に固定できる
  • Visual Studio も VS Code も .editorconfig をサポートしており、 各エディタのデフォルト設定より .editorconfig の指定が優先される

そのため、チーム開発・OSS 開発などで、

「とにかくこのリポジトリは全部 UTF-8 にしてほしい」

というときは、.editorconfig に書いておくのが一番確実です。

参考リンク

検証時の環境

  • Visual Studio 2022 Version 17.14.10
  • VSCode October 2025 (version 1.106)

まとめ

文字化け問題は対策で未然に防ぐのが一番ですが、そのうえで 「うっかり Shift_JIS になってしまった…」というときは この記事の小技を思い出してもらえたら嬉しいです。

最後まで読んでいただきありがとうございました!

おわりに

KENTEMでは、様々な拠点でエンジニアを大募集しています! 建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。 recruit.kentem.jp career.kentem.jp

*1:正確には CP932 / Windows-31J という Shift_JISをベースにMicrosoftが独自に拡張した文字コード

*2:厳密にはVS Codeの内部文字列表現はOSやランタイムに依存しますが、Windows 環境では UTF-16 として扱われます。

*3:Visual Studio の既定エンコーディングは、バージョン・OS設定・プロジェクトテンプレートにより異なる場合があります。日本語 Windows 環境では、旧来は CP932 (Shift_JIS 相当) が既定となることが多かったため、本記事では代表例として扱っています。