IIS 가상디렉토리 파일 출력 한글 깨짐

image

위 환경입니다.

하고 싶은 것은 윈도우 서버에 경로를 잡고 텍스트, 마크다운, HTML 파일을 저장해두고 웹주소를 통해 브라우저에서 확인하고 싶습니다.

현재, IIS의 Site에

  1. 응용 프로그램 생성
  2. 가상 디렉토리 추가
  3. 디렉터리 검색 활성화
  4. MIME 형식에 text/markdown 등록
  5. ASP 기능 사용
  6. 코드페이지 값 65001 로 변경 (UTF-8)

까지 완료된 상태입니다.

하지만 아래와 같이 md 파일의 글자가 깨져보입니다.

image

신기하게도 txt 파일은 잘 나옵니다.

image

왜 글자가 깨져서 나올까요…?

2개의 좋아요

두파일음 각각 메모장으로 열어서 다른이름으로 저장 하시면 아래쪽에 인코딩이라고 나올겁니다.
그거 같은지 확인해보세요. 다르면 md파일을 txt파일하고 같게 저장하시면 될겁니다.

4개의 좋아요

image
image
image

아직 저장하기 전인데…vscode 상에는 둘 다 UTF-8로 되어있는 것 같습니다

2개의 좋아요

앗 저도 이번에 겪었던 문제네요.

저도 동일한 문제로 MIME에 추가해서 해결했던 것 같은데 또 다른 문제가 있나보네요.


혹시 다른분을 위해 MIME 관련 링크도 달아둘게요.

https://dynalon.github.io/mdwiki/#!tutorials/iis/iis.md

1개의 좋아요

이거는 해놨고, 2016년도 이후부터는 .md의 MIME Type이 text/markdown으로 바뀌었다고 합니다.

text/x-markdown은 옛날 거라네요.

2개의 좋아요

인터넷 프로토콜 상에서 UTF-8 깨짐은 BOM (Byte Order Mark) 문제일 확률이 높은데요,

Windows 환경에서 UTF-8을 사용하면 BOM이 항상 제일 앞에 붙습니다. 반면 인터넷 프로토콜을 공유하는 대다수의 소프트웨어나 단말에서는 UTF-8에서 BOM이 없이 시작하는 경우가 많은데요, BOM을 고려하지 않고 텍스트 인코딩을 시작해서 글자 깨짐이 많이 생기게 됩니다.

일단 파일 자체에서 BOM을 제거하고 저장하는 방법은 텍스트 에디터마다 전부 방법이 다르기 때문에 아래 가이드를 참고하시면 좋을 것 같습니다.

http://blog.wystan.net/2007/08/18/bom-byte-order-mark-problem

그리고 닷넷에서는 텍스트 인코딩을 할 때 BOM을 넣지 않도록 처리를 하는 것이 도움이 되는데요, 아래 예제처럼 Encoding.UTF8을 쓰면 StreamWriter 출력 시 BOM 3바이트가 붙고, new UTF8Encoding(false)로 UTF8을 쓰면 BOM 3바이트가 붙지 않게 됩니다.

using System;
using System.Text;
using System.Linq;
using System.IO;

public class Program
{
	public static void Main()
	{
		Console.WriteLine("Hello World");
		
        Encoding utf8BOM = Encoding.UTF8;
		Encoding utf8 = new UTF8Encoding(false);

        String unicodeString =
            "This Unicode string has 2 characters outside the " +
            "ASCII range:\n" +
            "Pi (\u03A0)), and Sigma (\u03A3).";
        Console.WriteLine("Original string:");
        Console.WriteLine(unicodeString);
        Console.WriteLine();
		
		var bomStream = new MemoryStream();
		using (var bomSW = new StreamWriter(bomStream, utf8BOM))
		{
			bomSW.Write(unicodeString);
		}

		var stream = new MemoryStream();
		using (var SW = new StreamWriter(stream, utf8))
		{
			SW.Write(unicodeString);
		}
		
		Console.WriteLine(string.Join(" ", bomStream.ToArray().Take(10).Select(x => string.Format("{0:X2}", x))));
		Console.WriteLine(string.Join(" ", stream.ToArray().Take(10).Select(x => string.Format("{0:X2}", x))));
	}
}

7개의 좋아요

@rkttu 님 말씀대로 editplus에서 파일을 utf-8 + bom으로 저장하니 정상출력되네요~

예전에는 익스플로러 브라우저설정에 인코딩 설정이 있었는데 chrome에는 자동감지라 utf-8 + bom으로 해야 정상 인코딩 처리되는 것 같습니다.

5개의 좋아요

아…vscode에서 UTF-8 with BOM 이런게 있었는데 무심코 지나쳤었는데 BOM이 그런 뜻이었군요…ㅎㅎ

두 파일 모두 vscode로 확인해보니까 UTF-8 with BOM 아니고 UTF-8 이던데 왜 다르게 나오는지 의문이군요…?

그래서 vscode로 txt와 md 파일을 모두 UTF-8로 해서 새로 문서를 만들어보니 이번엔 둘 다 깨져서 보이네요…

도무지 뭐가 문제인지…ㅋㅋ

그냥 aspnetcore 써서 하는 것으로 결론을 내렸습니다.

이번 회에 웹도 해보고…

좋은 개념 알려주셔서 감사합니다~!

3개의 좋아요