質問: "Details"; } こんにちは、 @Model.Name さん ``` ブラウザ上では以下のように表示されます。(`@Model.Name`には「山田太郎」が格納されているとします) ``` ����ɂ��́A 山田太郎 ���� ``` Controllerから渡された引数については、ちゃんと日本語が表示されているので、ブラウザ側の文字コードの問題ではないと考えています。 ググってみてはみたものの、情報を見つけることができませんでした。 文字化けを解決する方法をご存知の方、助けていただけませんでしょうか。よろしくお願い致します。 なお、環境は以下の通りです。 * IDE : Visual Studio 2017 * テンプレートプロジェクト : ASP.NET Core Webアプリケーション(.NET Core) * .NET Coreのバージョン : 1.1 * データベースファーストでModelを作成後、スキャフォールディングにてControllerとViewを作成 --- **補足** `_Layout.cshtml`の``に記載された文字コードは以下のようになっています。 ``` ```
回答: 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