이것은 전형적인 “잘못된 코덱” 문제입니다.
테스트 케이스로, (이 예시에서는 python을 사용하여) 게시물의 원시 데이터를 읽으면:
In [1]: import urllib
In [2]: u = urllib.request.urlopen('https://meta.discourse.org/posts/1418409/raw')
In [3]: r = u.read(); r
Out[3]: b'As described here (https://meta.discourse.org/t/embed-discourse-comments-on-another-website-via-javascript/31963/453), when embedding Discourse into my website, the title is correctly parsed. But as it contains umlauts, titles like \xe2\x80\x9cIch w\xc3\xbcrde\xe2\x80\x9d end up in \xe2\x80\x9cIch w\xc3\x83\xc2\xbcrde\xe2\x80\x9d.\n\nIs this a general problem, a problem with my page or any workaround for that? Thanks!'
우리는 바이트를 얻지만, 이를 어떻게 디코딩해야 하는지 알지 못합니다. 그러나 응답 헤더 중 하나가 UTF-8을 사용해야 한다고 알려줍니다:
In [4]: u.headers['content-type']
Out[4]: 'text/plain; charset=utf-8'
In [5]: r.decode('utf-8')
Out[5]: 'As described here (https://meta.discourse.org/t/embed-discourse-comments-on-another-website-via-javascript/31963/453), when embedding Discourse into my website, the title is correctly parsed. But as it contains umlauts, titles like “Ich würde” end up in “Ich würde”.\n\nIs this a general problem, a problem with my page or any workaround for that? Thanks!'
In [6]: print(r.decode('utf-8'))
As described here (https://meta.discourse.org/t/embed-discourse-comments-on-another-website-via-javascript/31963/453), when embedding Discourse into my website, the title is correctly parsed. But as it contains umlauts, titles like “Ich würde” end up in “Ich würde”.
Is this a general problem, a problem with my page or any workaround for that? Thanks!
문자가 게시한 그대로임을 알 수 있습니다. 그러나 해당 바이트에 대한 잘못된 해석이 이루어지면 — 특히 UTF-8 대신 ISO-8859-1로 해석하는 일반적인 실수가 발생하는 경우(아래에서 명확성을 위해 문자열을 줄임) — 다음과 같은 결과가 나옵니다:
In [7]: snippet = r[220:255]; snippet
Out[7]: b'titles like \xe2\x80\x9cIch w\xc3\xbcrde\xe2\x80\x9d end up'
In [8]: snippet.decode('utf-8')
Out[8]: 'titles like “Ich würde” end up'
In [9]: snippet.decode('iso-8859-1')
Out[9]: 'titles like â\x80\x9cIch würdeâ\x80\x9d end up'
이것을 print하면 터미널이 멈춥니다. 놀랍군요. ![]()
요약하자면: Discourse에서 게시물 데이터를 가져오는 데 사용하는 도구가 utf-8 대신 iso-8859-1로 처리하고 있습니다.
(추측) 아마도 Discourse 사이트에서 가져온 원시 바이트를 iso-8859-1 코드페이지로 서빙되는 페이지에 임베드하고 있는 것 같습니다.