Google无法读取网址中包含特殊字符的站点地图

时间:2012-08-09 11:34:59

标签: php xml character-encoding sitemap

我有一个用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整个站点地图文件的网址示例:

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

我的问题是 - 如何对这些特殊字符(以及其他类似字符)进行编码,以便sitemap仍然可以检查出来。如果这是一个解决方案,我会使用哪种PHP编码功能?是使用str_replace并将这些字符替换为普通字符的唯一解决方案吗?这不会是一个问题,无论你在第一部分写的是什么,URL都可以工作,因为那部分仅用于搜索引擎优化,但这会非常耗时。我希望能够以不会破坏谷歌站点地图的方式编写这些特殊字符。

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

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

1 个答案:

答案 0 :(得分: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函数对字符串进行任何操作。

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