0

我正在使用 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>

请注意 - 替换为 –。

字符集在标头中设置为 utf-8:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

这发生在许多应该是通用 ASCII 字符的情况下。

这里发生了什么,我该如何解决?

我知道这是一个 unicode 问题,但不知道如何处理。

4

1 回答 1

0

那不是连字符;那是一个endash,它是一个与字母N(名称的由来)大致相同宽度的破折号。

Endash 的 Unicode 代码点为 u+2013(十六进制),它在 UTF-8 中转换为三个八位字节(字节),因此如果您错误地将内容视为 ASCII,这看起来几乎是正确的。

在 u+2014 还有一个 Emdash(基于 M 的宽度)。

解决方法实际上是尊重您正在使用的页面的编码;如果它说它是 UTF-8,请确保使用该编码解析页面。有许多 Unicode 代码点看起来与 ASCII 字符相似,但并不完全相同。其中一些是为了与遗留编码兼容而存在的,还有一些是因为有足够强的案例证明它们是基本不同的字符(包括一些传统的连字,这些字符已经被称为不同的字符)。

某些映射启用的转换称为“最佳拟合转换”,其中选择与目标编码“足够接近”(根据某种定义)的字符,而不是使用“默认”映射(通常是问号或未知字符标记),但我只建议用于处理某些遗留编码。UTF-8 在大多数环境中已经很容易处理了 14 到 18 年,因此正确处理应该不是负担。

于 2013-05-26T04:15:04.507 回答