質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • C#

    8837questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • ASP.NET

    611questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NET Core でスキャフォールディングすると文字化けする

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,528
退会済みユーザー

退会済みユーザー

主題の通り、ASP.NET coreのスキャフォールディングで作成されたViewフォルダ内のcshtmlファイルに記載された日本語が文字化けします。

具体的に、例えば以下のように記述すると、

@model SampleViewMvc.Models.Person

@{
    ViewData["Title"] = "Details";
}

<p>
    こんにちは、 @Model.Name さん
</p>

ブラウザ上では以下のように表示されます。(@Model.Nameには「山田太郎」が格納されているとします)

����ɂ��́A 山田太郎 ����

Controllerから渡された引数については、ちゃんと日本語が表示されているので、ブラウザ側の文字コードの問題ではないと考えています。

ググってみてはみたものの、情報を見つけることができませんでした。
文字化けを解決する方法をご存知の方、助けていただけませんでしょうか。よろしくお願い致します。

なお、環境は以下の通りです。

  • IDE : Visual Studio 2017
  • テンプレートプロジェクト : ASP.NET Core Webアプリケーション(.NET Core)
  • .NET Coreのバージョン : 1.1
  • データベースファーストでModelを作成後、スキャフォールディングにてControllerとViewを作成

補足

_Layout.cshtml<head>に記載された文字コードは以下のようになっています。

<meta charset="utf-8" />
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

VS2017, Core は試せる環境がないので分かりませんが、VS2015, .NET の MVC5 アプリの場合、デフォルトで View のソースは BOM 付きの UTF-8 になります。VS2015 のエディタから書きこんだ日本語も UTF-8 になります。なので、普通に作っていれば文字化けするはずはないのですが・・・

まずは Fiddler などのキャプチャツールを使って、ASP.NET からブラウザに送信される「����ɂ��́A 山田太郎 ����」の部分のバイト列がどうなっているか調べてみませんか?

ASP.NET アプリはデフォルトで応答ヘッダに charset=utf-8 が指定されるので、UTF-8 でないと文字化けします。

ということは質問者さんが View に書き込んだ「こんにちは、 さん」からレンダリングされてブラウザに送信されるバイト列の文字コードが UTF-8 ではないということのはずですが、それが何なのかが分かると解決のヒントになるかもしれません。

------ 2017/6/14 14:40 追記 ------

2017/06/14 13:31 の私のコメントで「VS2015 でも問題を再現できました。詳細は回答欄に追記しておきます」と書きましたが、それを以下に書きます。

VS2015 でも「ビューの追加」のダイアログからウィザードベースでビューを生成すると(すなわちスキャフォールディング機能を利用してビューを生成すると)、生成される .cshtml ファイルの文字コードは Shift_JIS になってしまいます。

その .cshtml ファイルに Visual Studio のエディタで日本語を書き込むと、理由不明ですがその文字は Unicode デコーダでデコードできないようで、REPLACEMENT_CHARACTER (U+FFFD ⇒ UTF-8 のバイト列は EF BF BD)に置き換えられ、その REPLACEMENT_CHARACTER がブラウザ上で � と表示されるという質問者さんと同じ問題が再現されました。

従前の .NET ベースの MVC アプリであれば、先のレスでも書きましたが、.cshtml ファイルの文字コードは BOM 付きの UTF-8 になります。また、それを Shift_JIS で保存し直してから日本語を書き込んでも今回のような問題は出ないです。

何故 Core ベースのアプリでは Visual Studio に自動生成させた .cshtml ファイルの文字コードは Shift_JIS になってしまうのか、何故デコードできないのかは謎です。

一般的にまだ枯れてないフレームワークにはいろいろ不具合があると思いますが、今回の問題もそういった不具合の一つということでしょうか。

ちなみに、ビューのフォルダを右クリック⇒[追加(D)]をクリック ⇒[新しい項目(W)...]をクリック ⇒[MVC ビューページ]を選択して名前を付けて[追加(A)]をクリック・・・で生成される空の .cshtml ファイルは UTF-8 になりました。なので、やはり UTF-8 になるべきなのであろうと思います。

自分の環境は以下の通りです。

Visual Studio 2015 Community 2015 Update 3
ASP.NET Core Web Application (.NET Core) のテンプレート使用
.NET Framework 4.6.1
Windows 10 Professional 64-bit
IIS 10.0 Express

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/12 23:53

    ありがとうございます。
    紹介いただいたFidderを使用して、HexViewしてみたところ、「こんにちは、」の部分が以下の通りでした。

    ```
    0xEF, 0xBF, 0xBD, 0xEF, 0xBF, 0xBD, 0xEF, 0xBF, 0xBD, 0xEF, 0xBF, 0xBD, 0xC9, 0x82, 0xEF, 0xBF, 0xBD, 0xEF, 0xBF, 0xBD, 0xCD, 0x81, 0x41
    ```

    EF BF BD というのが、ググってみたところ、UTF-8の変換に失敗したときの文字化けのようですね・・・

    キャンセル

  • 2017/06/13 11:07

    結果の連絡をありがとうございました。

    MSDN ライブラリ(URL 下記)によると "Unicode デコーダーでは、デコードできない 2 バイトのシーケンスが REPLACEMENT_CHARACTER (U+FFFD) に置き換えられます" とのことで、その結果(U+FFFD の UTF-8 のバイト列は EF BF BD)ということのようですね。

    .NET Framework における文字エンコーディング
    https://msdn.microsoft.com/ja-jp/library/ms404377(v=vs.110).aspx

    先にも書きましたが、自分の環境(VS2015, .NET の MVC5 アプリ)の場合、デフォルトで View のソースは BOM 付きの UTF-8 になり、VS2015 のエディタから書きこんだ日本語も UTF-8 になります。なので、普通に作っている限り、Unicode デコーダーがデコードできないという問題は起こり得ないです。

    自分の環境では、バイナリエディタ(VS 付属の)で View を開いて、Shift_JIS コードで「こんにちは」と書き込むというような、普通ではまずやらないことをしないと「デコードできない」という問題は再現できなかったです。

    ググって調べると Core のコンソールアプリで文字化けの事例が報告されてますが、それは今回の話「デコードできない」とは違うようです。他には Core で文字化けの事例は見つけられませんでした。

    というわけで、すみませんが、質問者さんと同じ環境同じ手順で問題が再現できない自分はお役に立てなそうです。

    キャンセル

  • 2017/06/13 21:55

    ありがとうございます。
    情報をいただきまして、恐縮です。
    結果として、ファイルがshift_jisであるのが原因のようです。
    上の方の回答にも関連しますので、まとめて経過を書かせていただきます。

    キャンセル

  • 2017/06/14 13:31

    どうしても VS2017 が使える環境が手に入らなかったので、VS2015 Update 3 で試してみましたが、VS2015 でも問題を再現できました。詳細は回答欄に追記しておきます。

    キャンセル

+1

こんにちは。

cshtmlファイル自体がshift_jisなどの文字コードで保存されていたりしませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/13 14:52 編集

    それは少なくとも自分の環境(VS2015, .NET の MVC5 アプリ)では問題ないのですが、tamoto さんはそれで質問者さんの問題を再現できるのでしょうか?

    キャンセル

  • 2017/06/13 14:57

    dotnet-cliで作成したmvcテンプレートから、Index.cshtmlの中に日本語を直接記述し、それをあえてshift_jisで保存したところ、記述した日本語が質問にあるような表示に化けることは確認しました。

    キャンセル

  • 2017/06/13 15:17

    自分は VS2015 のエディタで View に日本語を入力して保存し、VS2015 上では一旦 View を閉じて、メモ帳で View のファイルを開いて ANSI (Shift_JIS) で保存し直し・・・という手順で試したのですが文字化けはなかったです。

    ファイルの中身も確認しましたが、日本語を含め Shift_JIS になっていました。

    tamoto さんの手順で View のファイルの中身はどうなっているのでしょう? dotnet-cli で作成、shift_jis で保存するとどうなるか分からないのですが、日本語の部分を含めすべて shift_jis になりますか?

    キャンセル

  • 2017/06/13 15:26 編集

    shift_jisで保存というのは、単純にエディタからshift_jisとして保存しただけです。そういう意味ではメモ帳で開いてshift_jisで保存と同等の操作になります。
    ASP.NET CoreはASP.NET MVCとは似た機能を提供する全く別のソリューションなので、おそらく内部的な挙動の差異に引っかかったのではないでしょうか。

    キャンセル

  • 2017/06/13 20:16

    情報をありがとうございます。後で自分でも検証してみます。質問者さんが出てこないのでなんですが「スキャフォールディングすると文字化けする」がホントにそうなのか気になるところです。

    キャンセル

  • 2017/06/13 22:01 編集

    ご回答ありがとうございます。

    まさかとは思いましたが、結論から言うと、おっしゃる通り`cshtml`ファイル自体がshift_jisの文字コードになっていました。
    (テキストエディタで開いて文字コードを確認しました)

    `cshtml`ファイル自体は、VS2017上で、Controllersフォルダを右クリックして、「追加」→「新規スキャフォールディングアイテム」で作成したもので間違いありません。

    お二方の環境(VS2015)だと、デフォルトで文字コードがUTF8なのですね。
    VS2017の設定に何か問題があるのかもしれません。
    ちょっと調査してみますが、対策方法はわかりました(テキストエディタで文字コードをUTF8にして保存するという荒業ですが・・・)ので、助かりました。

    お二方、ありがとうございました。

    キャンセル

  • 2017/06/13 22:40

    解決して良かったです。

    以下おまけ、多分に推測を含む小話ですが……
    長い歴史を持つVisualStudioは、元来shift_jis + CRLFのフォーマットを偏重していました。現状でも、コードフォーマットや自動生成が基本的に上記のフォーマットで生成されるため、gitなどでutf-8 + LFを常用している場合に多少辛いものがありました。一方で、.NET Coreはその成り立ちから、デフォルトでutf-8を採用しています。驚くことに、shift_jisはデフォルトでは搭載すらされていません!そのため、.NET Coreは文字コードの統一が推し進められ、利便性が向上した代わりに、文字コードの混在系の問題には却って引っかかりやすくなった側面があります。おそらく今回の問題は、VisualStudio側のスキャフォールディング機能がレガシーを引きずっていたため、日本語を含んだファイルを生成する際に暗黙的にshift_jisを選択してしまったところで、ASP.NET Coreがshift_jisのテンプレートを解釈しなくなったために発生した問題であると推測しています。簡潔な再現環境作成手順と共に改善要望を出してみてもよい問題かと思います。

    キャンセル

同じタグがついた質問を見る

  • C#

    8837questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • ASP.NET

    611questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。