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(ø)を表すことを意図していますか?その場合は、生のUnicodeコードポイント番号ではなく、UTF-8エンコーディングを使用する必要があります。「Å」は、である必要が%C3%85あり、「ø」はである必要があります%C3%B8

URIエンコードの詳細については、RFC3986を参照してください。


PHPでこれを行うことは、PHP文字列が実際にはバイト文字列であり、Unicode文字列ではないという事実によって複雑になります。抽象Unicode文字を格納することはできません。これらの文字のエンコードされた表現は、UTF-8やUTF-16などの特定のエンコードでのみ保存できます。mbstring拡張機能を使用して、エンコードされたUnicode文字列を操作できますが、これを正しく行うことは、アプリケーション全体でUnicodeテキストをすべて処理するためにmbstring関数を使用することを意味します。

ソースでこのエンコーディングの問題を修正することを検討する必要があります。プログラムは、文字U + 00C5を表すバイト0xC5を含む文字列をどのように取得しましたか?どこかで、Unicodeコードポイント番号が直接バイトに変換されると想定している必要がありますが、これは誤りです。それを見つけて修正し、データが最初にUTF-8形式のPHP文字列に読み込まれるようにし、その後、文字列の操作にmbstring関数を使用します。

URLのUTF-8表現を含む文字列を取得しrawurlencode()たら、正しいパーセントエスケープ結果が得られるはずです。

于 2012-08-09T11:50:22.867 に答える