代码之家  ›  专栏  ›  技术社区  ›  Dan Horvat

谷歌无法读取URL中包含特殊字符的网站地图

  •  0
  • Dan Horvat  · 技术社区  · 12 年前

    我得到了一个用PHP动态创建的大型网站地图,它有一个网站地图索引,其中有大约230个独立的网站地图,每个网站地图都有3.000到15.000个URL。

    在这230个网站地图中的大多数中,一切都还好,但在其中一些网站地图中,一些URL包含特殊字符,谷歌返回一个错误,不接受这样的网站地图。正常的、可接受的URL示例:

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

    一个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,但这会很耗时。我更希望能够以一种不会破坏谷歌网站地图的方式来书写这些特殊的字符。

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

    <?xml version='1.0' encoding='UTF-8'?>
    
    1 回复  |  直到 12 年前
        1
  •  1
  •   Community Ian Goodfellow    3 年前

    %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字符串,但正确地这样做可能意味着使用 全部的 在整个应用程序中处理Unicode文本。

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

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