7

私は現在、ブリザード コミュニティ API から JSON データを取得し、PHP で解析するアプリケーションに取り組んでいます。名前に特殊文字が含まれるキャラクターにたどり着くまで、すべて問題なく動作します。

キャラクター データを取得するには、キャラクターの名前と、そのキャラクターが存在する領域を知る必要があります。

名前とレルムを URL 経由でキャラクター ページに渡し、そこからその情報を使用してキャラクター データを取得します。

この時点で、私の URL は次のようになります。

 http://localhost/guildtree/characters.php?realm=argent-dawn&name=Ankzu

この時点で、アクセントのある文字のデータを取得しようとすると、有効な文字ではないため、エラー ページにリダイレクトされます。

URL の書き換えを開始して初めて、問題が発見されました。行のどこかで特殊文字がいくつかの本当に奇妙な文字に置き換えられているため、エラーページにリダイレクトされています。

私の新しく書き換えられた URL では、次のように動作します。

 http://localhost/guildtree/argent-dawn/ankzu

ただし、名前に特殊文字を含む文字はエラー メッセージになります。

 http://localhost/guildtree/argent-dawn/notúk

次のエラー メッセージが表示されます。

"見つかりません

要求された URL /guildtree/argent-dawn/notúk は、このサーバーで見つかりませんでした。」

ご覧のとおり、ú が ú に置き換えられていますが、URL をコピーして貼り付けると、ú は %C3%BA と表示されます。

ú が ú と表示されている理由は、2 バイトの Unicode ú が 2 つの 1 バイト ASCII 文字に押しつぶされて ú が表示されるためだと私は理解しています。

すべてのページのヘッダーに次のものが含まれていることを確認しました。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

私のアプリケーションが適切に動作するためには、これらの特殊文字が適切に表示される必要があるため、実際には ú として表示する必要があります。

キャラクター名は、次のように単純に URL から取得されます。

$charName = $_GET['name'];

$charName をエンコードして特殊文字を正しく表示することは可能ですか?

考えられることはすべて試し、Google で検索しましたが、何も機能しませんでした。

また、私は URL 書き換えを使用しているため、これらの特殊文字を許可する書き換えルールは何ですか?

これが私の現在の書き換えルールです:

 RewriteRule ^([a-zA-Z0-9_'-]+)/([a-zA-Z]+)$        characters.php?realm=$1&name=$2     [NC]

([a-zA-Z]+) は特殊文字をまったく許可しないことを認識しています。現在、特殊文字を適切に表示する作業を行っています。([a-zA-Z\ú]+) を使用すると、必要に応じて動作し、ページが表示されます。ルールに \ú を追加するのは、これを行うには非常に貧弱な方法のように思われ、アクセント付き文字に対応する文字を使用している間は常に機能するとは限りません。

どんな助けでも大歓迎です。さらに情報が必要な場合は、お問い合わせください。

編集:

書き換えルールを以下のように変更すると、情報を正常に取得できますが、CSS のリダイレクト ループが作成されます。

 RewriteRule ^([a-zA-Z0-9_'-]+)/([^/]+)$        characters.php?realm=$1&name=$2 [NC]

たとえば、私のCSSはにリダイレクトされています

http://localhost/guildtree/css/error

それ以外の

http://localhost/guildtree/css/style2.css

アップデート:

いくつかの簡単なテストを通して:

$charName = $_GET['name'];
$charNameTEST = utf8_encode($charName);

変更を行いますが、これを自分のページに適用すると、次のように表示されます。

"見つかりません

要求された URL /guildtree/argent-dawn/notúk は、このサーバーで見つかりませんでした。」

主な問題は URL のリダイレクトにあると思います。なぜなら、JSON データにアクセント付きの文字が含まれている場合、完全に問題なく解析できるからです。ブラウザー バーで guildtree/argent-dawn/notúk にあると表示され続けているのに、/guildtree/argent-dawn/notúk をプルアップしようとしている理由がわかりません。

4

3 に答える 3

3

ú は URL の有効な文字ではありません。

ユーザー名をリンクする場所はどこでも、URL エンコードする必要があります。

したがって、参照する正しい URL は次のとおりです。

http://localhost/guildtree/argent-dawn/not%C3%BAk

次のようにphpで印刷する必要があります。

echo '<a href="http://localhost/guildtree/argent-dawn/'. urlencode($name) .'">Link</a>;
于 2012-08-24T14:54:07.443 に答える
2

この質問にあなたの答えがあるかもしれないと思います。私はこれを自分で試したことはありませんが、私が見ることができることから、RewriteRuleを次のように書き直す必要があります。

RewriteRule ^([a-zA-Z0-9_'-]+)/([a-zA-Z]+)$        characters.php?realm=$1&name=$2     [NC,B]

Bフラグは、特殊文字がURLエスケープされることを保証するため、$2の名前で表示される値はパーセントエンコードされます。リダイレクトを行っていないため、元のUnicode文字はURLに表示されている文字のままである必要があります。

また、正規表現がUnicode文字と一致するように、正規表現にいくつかの変更を加える必要があります。それらがどうなるかはわかりません。

ここには、URLでUnicode文字がどのように機能するかについての説明もあります。

于 2012-08-24T15:02:44.273 に答える
2

これを適切に機能させるには、2 つのことを行う必要があります。

まず、これを .htaccess に追加します

AddDefaultCharset On
AddDefaultCharset UTF-8
AddCharset UTF-8 .tpl
AddCharset UTF-8 .js
AddCharset UTF-8 .css
AddCharset UTF-8 .php

次に、特殊文字を (.*) に許可する必要がある書き換えルールの部分を次のように変更します。

 RewriteRule ^([a-zA-Z0-9_'-]+)/(.*)$       characters.php?realm=$1&name=$2     [NC]

これにより、他のページでリダイレクト ループが発生する可能性がありますが、現在修正に取り組んでいます。

于 2012-08-24T20:50:41.063 に答える