Problema com umlauts ao incorporar Discourse em outro site

Conforme descrito aqui (Embed Discourse comments on another website via Javascript - #453 by limetti), ao incorporar o Discourse no meu site, o título é analisado corretamente. Mas como ele contém umlauts, títulos como “Ich würde” acabam como “Ich würde”.

Este é um problema geral, um problema com a minha página ou existe alguma solução alternativa para isso? Obrigado!

Este é um problema clássico de “codec errado”.

Como um caso de teste, se lermos (via python, neste exemplo) os dados brutos da sua postagem:

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!'

Obtemos bytes, mas não sabemos como decodificá-los. No entanto, um dos cabeçalhos de resposta nos diz que devemos usar 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!

Você notará que os caracteres parecem exatamente como você postou. Mas quando a interpretação errada desses bytes é feita — especialmente quando o erro comum de interpretar esses bytes como ISO-8859-1 em vez de UTF-8 (string encurtada para clareza abaixo), você obtém:

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'

Se eu print isso, meu terminal trava. Incrível. :smiley:

Para resumir: o que quer que você esteja usando para extrair os dados da postagem do Discourse está tratando como iso-8859-1 em vez de utf-8.

(especulando) Talvez você esteja incorporando os bytes brutos extraídos de um site Discourse em uma página que está sendo servida com uma codepage de iso-8859-1.

3 curtidas

Muito obrigado pela dica. De fato, a meta-tag UTF-8 estava depois da tag title :wink:

Funciona agora!

1 curtida

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.