波兰名称(Wężarów)从json服务返回W \ u0119 \ u017car \ u00f3w,呈现为Wężarów。无法弄清楚编码/字符集。

时间:2016-07-08 18:38:52

标签: encoding character-encoding

我正在使用DB-IP.com从IP地址获取城市名称。其中许多是国际城市,名字中有特殊字符。

例如,其中一个城市是波兰的Wężarów。检查控制台中的JSON返回或直接打开请求URL,它将从DB-IP返回为“W \ u0119 \ u017car \ u00f3w”,其内容类型为text / javascript; charset = UTF-8。这在浏览器中呈现为Wężarów - 它也被保存在我的mysql数据库中作为Wężarów(我尝试过使用utf8和latin1编码)。

我可以将它保存在DB中作为另一种格式,只要我可以将其转换回Wężarów以便在浏览器中显示。我尝试过几种格式的编码和解码,甚至只是直接在屏幕上显示(完全忽略了数据库)。我完全混淆了我需要做什么才能以可读格式获取它。

我正在使用PERL,但是如果我能弄清楚我需要用编码/解码/字符集做什么(因为我目前无能为力),我相信我可以从那里弄明白。< / p>

1 个答案:

答案 0 :(得分:3)

看起来UTF-8编码的字符串被浏览器解释为好像是Windows-1252。以下是我推断它的方法:

% python3
>>> s = "W\u0119\u017car\u00f3w"
>>> b = bytes(s, encoding='utf-8')
>>> b
b'W\xc4\x99\xc5\xbcar\xc3\xb3w'
>>> str(b, encoding='utf-8')
'Wężarów'
>>> str(b, encoding='latin-1')
'WÄ\x99żarów'
>>> str(b, encoding='windows-1252')
'Wężarów'

如果您对Python不熟悉,我在这里做的是将字符串"W\u0119\u017car\u00f3w"编码为UTF-8,产生字节序列'W\xc4\x99\xc5\xbcar\xc3\xb3w'。使用UTF-8解码得到'Wężarów',确认这是您想要的字符串的正确UTF-8编码。所以我猜测浏览器使用错误的编码来渲染它,并使用Latin-1对其进行解码。这给了我一些非常接近的东西,所以我查了Latin-1并注意到它被命名为Windows-1252的基础。再次解码为Windows-1252会给出您看到的结果。

这里出了什么问题,浏览器无法告诉使用什么编码来呈现页面,而且它的猜测是错误的。你需要通过明确告诉它使用UTF-8来解决这个问题。 Here's a page by the W3C描述了如何做到这一点。基本上您需要做的是向文档头添加HTML <meta>元素。如果您还设置了带有编码名称的HTTP标头,请确保它们是一致的。

(在Firefox中,当您正在调试时,您可以转到View - &gt;字符编码以逐页设置编码。我假设其他浏览器具有相同的功能。)