0

我有一个用 PHP 动态创建的大型站点地图,它有一个包含大约 230 个单独站点地图的站点地图索引,每个单独的站点地图有 3.000 到 15.000 个 URL。

在这 230 个站点地图中的大多数中,一切正常,但其中一些 URL 包含特殊字符并且 Google 返回错误,不接受此类站点地图。一个正常的、被接受的 URL 的例子:

http://www.site.com/Gentofte-Greve/Denmark 1 Badmintonligaen/12-fe-juice_a-1091627-1-33-1-odds/

损坏 Google 的整个站点地图文件的 URL 示例:

http://www.site.com/Team%20%C5rhus%20Elite-Solr%F8d%20Strand/Denmark 1 Badmintonligaen/12-fe-juice_a-1091631-1-33-1-odds/

任何特殊字符,例如北欧字符,都会破坏站点地图。这是北欧字符的示例:http: //www.borgos.nndata.no/alfabet.htm

我的问题是 - 我如何对这些特殊字符(和其他类似字符)进行编码,以便站点地图仍然可以正常检查。如果这是一个解决方案,我应该使用哪个 PHP 编码函数?是使用 str_replace 并用普通字符替换这些字符的唯一解决方案吗?这不是问题,无论您在它的第一部分写什么,该 URL 都有效,因为该部分仅用于 SEO,但这会很耗时。我希望能够以不会破坏 Google 站点地图的方式编写这些特殊字符。

关于我的站点地图的其他一切都很好,它们是用 UTF-8 编码的,或者至少它们应该使用这一行:

<?xml version='1.0' encoding='UTF-8'?>
4

1 回答 1

1

%C5和序列是%F8用来表示字符 U+00C5 (Å) 和 U+00F8 (ø) 的吗?如果是这样,您需要使用它们的 UTF-8 编码,而不是它们的原始 Unicode 代码点编号。'Å' 应该是%C3%85,而 'ø' 应该是%C3%B8

有关 URI 编码的更多信息,请参阅RFC 3986


在 PHP 中执行此操作很复杂,因为 PHP 字符串实际上是字节字符串,而不是 Unicode 字符串。它们不能存储抽象的 Unicode 字符;它们只能以特定编码(例如 UTF-8 或 UTF-16)存储这些字符的编码表示。您可以使用mbstring扩展来处理编码的 Unicode 字符串,但正确执行此操作可能意味着在整个应用程序中使用 mbstring 函数处理所有Unicode 文本。

您应该从源头上解决这个编码问题:您的程序是如何获得一个包含字节 0xC5 来表示字符 U+00C5 的字符串?某处某处必须假定 Unicode 代码点数字直接转换为字节,这是错误的。找到并修复它,以便您的数据首先以 UTF-8 格式读入 PHP 字符串,然后使用 mbstring 函数对字符串进行任何操作。

一旦你有一个包含 URL 的 UTF-8 表示的字符串,rawurlencode()应该会给你正确的百分比转义结果。

于 2012-08-09T11:50:22.867 回答