8

我有许多呈现无效字符的网站。页面的元标记指定 UTF-8 编码。但是,许多页面包含 UTF-8 无法解释的字符,可能是因为这些文件是使用另一种编码(例如 ANSI)保存的。我现在特别关心的是一个花哨的撇号(如“鲍勃的”……抱歉,如果没有正确显示)。W3 的验证器指示实体是“ \x92 ”,但它不会验证文件,因为它没有映射到 unicode。当然,如果我在 Notepad++ 中打开文件并将编码更改为 UTF-8,则该字符将替换为黑框中的 92。

这是我的问题:解决此问题的最简单方法是什么?我是否必须打开所有页面并用传统的撇号替换该字符?或者是否有一个我可以添加(例如,到 IIS)的快速修复,它可能会覆盖或修复编码问题?还是我必须蛮力查找/替换?我在这些网站上有数百个页面,我不知道我必须更改其中的多少,所以如果有人知道我可以规避这个问题或快速修复它的方法,我将不胜感激。

4

4 回答 4

2

您是否将页面作为直接 HTML 提供,或者您是否有另一个脚本提供内容?如果您有一个提供内容的脚本,该脚本可以只查找 \x92 的任何实例并将其替换为撇号。在 PHP 中,这将是一个简单的 str_replace()

如果您提供的是直接 HTML,那么您将不得不自己实际修改文件。这可以自动化,但是(如果您有数百个文件,可能应该是)取决于您可用的工具和您所在的操作系统。既然您说您使用的是 Notepad++,我想可以安全地假设你在 MS Windows 中(因此没有有趣的 Unix 命令来加快速度)

但是,可以创建一个可以执行此操作的 BATCH 脚本。命令提示符内置了非常简单的 ASCII 文本编辑工具。如果这不可能,那么如果您的系统上有编译器并且对 C 有一定的了解,那么很有可能制作一个 C 或 C++ 程序来执行此操作。如果您有前者而不是后者,请询问,我会整理一些来源为你。

于 2010-09-30T17:51:07.277 回答
1

我自己不确定它的编码部分,但如果你最终不得不通过蛮力来完成它,你总是可以编写一个短程序来遍历你的所有网页,将每个文件加载到内存中,运行regex.replace 修复问题字符,并将文件保存回磁盘。显然不理想,但比自己打开每个文件要好。

祝你好运

于 2010-09-30T17:47:48.303 回答
1

我刚刚遇到了一个类似的问题,其中一些没有破坏空格的“xA0”进入了一个所谓的 UTF-8 文档。在记事本++中,这些显示在一个黑色的盒子里,里面写着“xA0”。但是 notepad++ 不允许复制或粘贴它们。

我做了一些研究,发现了发生了什么。十六进制编辑器显示这些被编码为单个字节:“A0”,它是无效的 UTF-8。任何不是 ASCII 的都应该至少是两个字节,所以正确的编码是十六进制的“C2 A0”。

对于您花哨的撇号示例,您正在处理同样的事情。实际上,您的问题更复杂,因为在扩展 ascii 字符中 \x92 (十进制 146)是撇号,但在 unicode 中 \x92 是控制字符,右单引号应该是 U+2019 (十进制 8217)。在记事本++中添加这个符号(通过编辑->字符面板)并在十六进制编辑器中检查显示正确的十六进制编码是“E2 80 99”,二进制是 1110 0010 10 000000 10 011001。当您删除 UTF-8 控制字节(非粗体)时,这会产生 0010 0000 0000 0001 1001,它等于十进制值 8217。

处理此问题的正确方法是将文件作为字节流(c 中的 unsigned char *)打开并搜索不正确的 UTF-8 序列。然后你可以用 � 替换它们(见https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences)或者你可以尝试自定义处理它们,通过像 A0 -> C2 A0 (不正确编码的非空格)和 92 -> E2 80 99(编码不正确的右单引号)。

于 2016-08-26T19:52:37.347 回答
0

所有特殊字符都应进行 HTML 编码,例如版权符号应在您的 HTML 中为

©

HTML实体列表:

http://www.w3schools.com/HTML/html_entities.asp

至于如何实现这在很大程度上取决于您首先如何创建代码,但是像 ASP.Net 这样的东西将具有服务器端功能,例如:

Server.HTMLEncode("string with special chars")
于 2010-09-30T17:50:33.287 回答