私は現在、ブリザード コミュニティ 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 をプルアップしようとしている理由がわかりません。