2012-07-17 3 views
4

DB에서 소스 코드를 일반 문자열로 가져 와서 UTF8로 인코딩하는 VirtualPathProvider가 있습니다. 예를 들어MVC 3 UTF로 인코딩 된 면도 페이지 8은 인코딩 된 문자를 보여줍니다.

:

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

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

    return result; 
} 

내가 다음 UTF로서의 캐릭터 세트가있는 레이아웃 마스터 페이지를 마스터 페이지가 다음 내 VirtualPathProvider 페이지 출력이로를 얻을 수 @RenderBody()를 호출 8

<meta charset="utf-8"> 

브라우저.

wünschte이 wünschte을하게

내가 잘못 뭐하는 거지 :

문제는 인코딩 된 문자 페이지를 출력된다는 것이다?

TLDR :

나는 wünschte 대신 wünschte의 표시합니다. DB의 일반 문자열은 wünschte이지만 일단 메모리 스트림에서 내 페이지로 이동하면 wünschte가됩니다.

+0

그래서 UTF8로 인코딩 된 문자열을 표시하고 싶지 않으십니까? – Anand

+0

charset을 지정하면 인코딩 된 문자열을 일반 찾고 문자열로 렌더링해야합니다. 그것이 내가 어쨌든 그것을 이해하는 것입니다. – Bob

+0

아니요, 문자 세트를 UTF-8로 지정 했으므로 모든 영어가 아닌 문자가 원래 형식으로 표시됩니다. – Anand

답변

5

오늘 자신의 VirtualPathProvider 구현으로이 문제로 어려움을 겪은 사람이 면도날 은 실제로에서 바이트 순서 표시를 원합니다. 너는 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이없는 경우 면도기는 UTF8이 아니라 현재 코드 페이지로 기본 설정되어있는 것으로 보입니다. 위는 나를 위해 그것을 고쳤다.

위의 예에서 구현시 this.Template을 원래 질문의 _sourceCode으로 바꿉니다.

+0

나는 똑같은 문제를 안고 있었고 이것으로 해결되었다. 정답으로 표시해야합니다. –

+0

.cshtml 파일을 UTF BOM으로 저장하는 것도 중요합니다. 또한 "일반 사용"을위한 것이지 스트림을 통한 것이 아닙니다. – specimen