5

DBからソースコードをプレーン文字列として取得し、UTF8としてエンコードするVirtualPathProviderがあります。

例えば:

public override Stream Open()
{
  MemoryStream result = new MemoryStream();

  result = new MemoryStream(Encoding.UTF8.GetBytes(_sourceCode));

  return result;
}

次に、UTF8として文字セットを持つレイアウトマスターページがあります

<meta charset="utf-8">

次に、マスターページが呼び出し@RenderBody()て、VirtualPathProviderページを取得し、ブラウザーに出力します。

問題は、エンコードされた文字を含むページを出力していることです。

wünschteはwünschteになります

私は何が間違っているのですか?

TLDR:

wünschteの代わりにwünschteを表示したい。DBからのプレーンな文字列はwünschteですが、メモリストリームから私のページに到達すると、wünschteになります。

4

1 に答える 1

6

今日、彼自身のVirtualPathProvider実装でこれに苦労した人として、Razorは本当にバイト順マークを望んでいることがわかりました。を呼び出すことでこれを強制できますGetPreamble()

using System.Linq; // for Concat() because I am lazy

public override Stream Open()
{
    var template = Encoding.UTF8
        .GetBytes(this.Template);
    var buffer = Encoding.UTF8
        .GetPreamble()
        .Concat(template)
        .ToArray();
    return new MemoryStream(buffer);
}

BOMがない場合、RazorはデフォルトでUTF8ではなく現在のコードページに設定されているようです。上記は私のためにそれを修正しました。

this.Template上記の例では、私の実装で_sourceCodeは元の質問に置き換えます。

于 2013-05-03T14:28:52.743 に答える