我正在使用Mechanize在http://www.daz3d.com/pirates-black-pearl阅读网页。
页面看起来似乎没问题,但由于某些原因,某些字符的翻译方式不同。
例如,当我在firefox中查看页面的来源时,产品描述中有一个
,如下所示:
<p>Pirates – Black Pearl is a high quality conforming clothing from Pretty3D. Designed specifically for Victoria 4, Pirates – Black Pearl is a complete conforming outfit that includes a Dress, Corset, Panty, Boots, Necklace, Pistol Holder, and Seven Props.</p>
但是,当我查看Mechanize下载的内容时,我看到了:
<p>Pirates – Black Pearl is a high quality conforming clothing from Pretty3D. Designed specifically for Victoria 4, Pirates – Black Pearl is a complete conforming outfit that includes a Dress, Corset, Panty, Boots, Necklace, Pistol Holder, and Seven Props.</p>
注意 - 替换为 - 。
charset在标题中设置为utf-8:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
这种情况发生在许多应该是常见ASCII的字符中。
这里发生了什么,我该如何解决?
我知道这是一个unicode问题,但不知道如何解决这个问题。
答案 0 :(得分:0)
那不是连字符;这是一个endash,它的宽度大致与字母N(名称的来源)相同。
Endash的Unicode代码点为u + 2013(十六进制),它转换为UTF-8中的三个八位字节(字节),因此如果您错误地将内容视为ASCII,则看起来恰到好处。
在u + 2014上还有一个Emdash(基于M的宽度)。
修复方法实际上是尊重您正在使用的页面的编码;如果它说它是UTF-8,请确保使用该编码解析页面。有许多Unicode代码点看起来类似于不相同的ASCII字符。其中一些存在是为了与传统编码兼容,有些存在是因为有足够强大的案例表明它们是截然不同的字符(包括一些传统的连字,后来被称为不同的字符)。
有一个转换,一些映射启用称为“最佳拟合转换”,其中选择与目标编码“足够接近”(通过某种定义)的字符而不是使用“默认”映射(通常是问号或未知字符标记),但我只建议处理某些遗留编码。 UTF-8在大多数环境中都很容易处理14 - 18年,因此做正确的事情不应该是一种负担。