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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

ASP.NET

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

Q&A

解決済

2回答

9790閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

ASP.NET

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

0グッド

1クリップ

投稿2017/06/11 12:56

編集2017/06/11 13:19

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

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

cshtml

1@model SampleViewMvc.Models.Person 2 3@{ 4 ViewData["Title"] = "Details"; 5} 6 7<p> 8 こんにちは、 @Model.Name さん 9</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>に記載された文字コードは以下のようになっています。

HTML

1<meta charset="utf-8" />

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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 02:14

編集2017/06/14 05:41
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/12 14: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 02: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 12:55

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

退会済みユーザー

2017/06/14 04:31

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

0

こんにちは。

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

投稿2017/06/13 04:49

tamoto

総合スコア4103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/13 05:53 編集

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

2017/06/13 05:57

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

退会済みユーザー

2017/06/13 06:17

自分は VS2015 のエディタで View に日本語を入力して保存し、VS2015 上では一旦 View を閉じて、メモ帳で View のファイルを開いて ANSI (Shift_JIS) で保存し直し・・・という手順で試したのですが文字化けはなかったです。 ファイルの中身も確認しましたが、日本語を含め Shift_JIS になっていました。 tamoto さんの手順で View のファイルの中身はどうなっているのでしょう? dotnet-cli で作成、shift_jis で保存するとどうなるか分からないのですが、日本語の部分を含めすべて shift_jis になりますか?
tamoto

2017/06/13 06:29 編集

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

退会済みユーザー

2017/06/13 11:16

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

退会済みユーザー

2017/06/13 13:01 編集

ご回答ありがとうございます。 まさかとは思いましたが、結論から言うと、おっしゃる通り`cshtml`ファイル自体がshift_jisの文字コードになっていました。 (テキストエディタで開いて文字コードを確認しました) `cshtml`ファイル自体は、VS2017上で、Controllersフォルダを右クリックして、「追加」→「新規スキャフォールディングアイテム」で作成したもので間違いありません。 お二方の環境(VS2015)だと、デフォルトで文字コードがUTF8なのですね。 VS2017の設定に何か問題があるのかもしれません。 ちょっと調査してみますが、対策方法はわかりました(テキストエディタで文字コードをUTF8にして保存するという荒業ですが・・・)ので、助かりました。 お二方、ありがとうございました。
tamoto

2017/06/13 13: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のテンプレートを解釈しなくなったために発生した問題であると推測しています。簡潔な再現環境作成手順と共に改善要望を出してみてもよい問題かと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問