Проблема с умлаутами при встраивании Discourse на другой сайт

Как описано здесь (Embed Discourse comments on another website via Javascript - #453 by limetti), при встраивании Discourse на мой сайт заголовок парсится корректно. Однако, поскольку он содержит умлауты, такие заголовки, как «Ich würde», отображаются как «Ich würde».

Это общая проблема, проблема с моей страницей или есть какое-то обходное решение? Спасибо!

Это классическая проблема «неверной кодировки».

В качестве примера: если мы прочитаем (например, через 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!

Обратите внимание, что символы выглядят точно так же, как вы их опубликовали. Но когда эти байты интерпретируются неверно — особенно при распространённой ошибке интерпретации этих байтов как ISO-8859-1 вместо UTF-8 (ниже приведён сокращённый фрагмент строки для наглядности), получается:

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 для этого, мой терминал зависнет. Удивительно. :smiley:

Подводя итог: что бы вы ни использовали для извлечения данных поста из Discourse, оно трактует их как iso-8859-1 вместо utf-8.

(предположительно) Возможно, вы встраиваете необработанные байты, полученные с сайта Discourse, на страницу, которая отдаётся с кодировкой iso-8859-1.

Спасибо большое за подсказку. Действительно, мета-тег UTF-8 был после тега title :wink:

Теперь работает!