5

http://www.example.com/?query=Траливалиのような Firefox (アドレス行) の URL を入力すると、自動的にhttp://www.example.com/?query=%D2%F0にエンコードされます。 %E0%EB%E8%E2%E0%EB%E8 .

ただし、http://www.example.com/#ajax_call?query=Траливали のような URL変換されません。

IE8 などの他のブラウザーは、クエリをまったく変換しません。

問題は、クエリがエンコードされているかどうかを (PHP で) 検出する方法です。それをデコードする方法は?

私はもう試した:

  1. $str = iconv('cp1251', 'utf-8', urldecode($str) );

  2. $str = utf8_decode(urldecode($str));

  3. $str = (urldecode($str));

  4. http://php.net/manual/en/function.urldecode.phpの多くの関数は機能し ません。

テスト:

$str = $_GET['str'];

d('%D2%F0%E0%EB%E8%E2%E0%EB%E8' == urldecode('%D2%F0%E0%EB%E8%E2%E0%EB%E8'));

d('%D2%F0%E0%EB%E8%E2%E0%EB%E8' == $str);

d('Траливали' == $str);

d(urldecode($str));

d(utf8_decode(urldecode($str)));

!!! d('%D2%F0%E0%EB%E8%E2%E0%EB%E8' == urlencode($str)); !!!

戻り値:

[偽] [偽] [偽] ��������� ???? [真実]

ある種の解決策: http://www.example.com/Траливали/ - クエリを URL 部分として送信し、mod_rewrite で解析します。

4

7 に答える 7

7

queryフラグメントの後の URLの部分が無効であるとして変換されません。

RFC 3986では、次の部分で構成される URI を定義しています。

     foo://example.com:8042/over/there?name=ferret#nose
     \_/   \______________/\_________/ \_________/ \__/
      |           |            |            |        |
   scheme     authority       path        query   fragment

順序は変更できません。したがって、

URL1: http://www.example.com/?query=Траливали#ajax_call

の間、適切に処理されます。

URL2: http://www.example.com/#ajax_call?query=Траливали

しない。を見るとURL2、IE は実際にフラグメントを#ajax_call?query=Траливалиクエリなしで検出することにより、URL を適切に処理しています。フラグメントは常に最後にあり、サーバーに送信されることはありません。

IE は、クエリ コンポーネントをクエリURL1として検出するため、適切にエンコードします。

PHPでのデコードに関しては%D2、同様に変数で自動的にデコードされ$_GET['query']ます。$_GET変数が適切に入力されなかった理由は、URL2に標準に従ったクエリがないためです。

また、最後に 1 つ... を実行する場合'Траливали' == $_GET['query']、これは PHP スクリプト自体が UTF-8 でエンコードされている場合にのみ当てはまります。テキスト エディタは、ファイルのエンコーディングを教えてくれるはずです。

于 2010-07-30T03:09:44.837 に答える
3
rawurldecode($_GET['query']);

しかし、これは実際にはphpによってすでに行われているはずです;-)

「何も機能しない」と言っている編集-何をしようとしていますか? たとえば、テキストが画面に表示されない場合echo $_GET['query'];、ブラウザに送り返されるページに指定しているエンコーディングに問題がある可能性があります。

行を含める

header("Content-Type: text/html; charset=utf-8");

そして、それが役立つかどうかを確認してください。

于 2010-07-30T03:01:49.223 に答える
2

フラグメントがどのようにエンコードされるかは、残念ながらブラウザに依存します。

フラグメントID(ハッシュ)は、RFCで義務付けられたURLエスケープルールを適用してエンコードされていますか?
MSIE:いいえ
Firefox:部分的に
Safari:はい
Opera:いいえ
Chrome:いいえ
Android:はい

ブラウザがエスケープシーケンスに変換する前に国際(非ASCII)文字をエンコードするためにどのエンコードを使用するかについては%nn、「ほとんどのブラウザは、URLバーに入力されたテキストにデフォルトでUTF-8データを送信することでこれに対処します。手作業で、フォローしているすべてのリンクでページエンコーディングを使用します。」(同じソース)。

于 2010-07-30T03:24:52.063 に答える
1

これに使用できますUTF8::autoconvert_request()

詳細については、http://code.google.com/p/php5-utf8/をご覧ください。

于 2011-06-03T19:20:20.463 に答える
0

答えは簡単です。文字列は常にエンコードされます。HTTP 標準に記載されているとおりです。
そして、Firefoxディスプレイとは何ですか- それは問題ではありません.

また、PHP はクエリ文字列を自動的にデコードするため、デコードも必要ありません。

'%D2%F0%E0%EB%E8%E2%E0%EB%E8' は 1 バイト エンコーディングであるため、ページはおそらく 1251 になっていることに注意してください。少なくとも HTTP ヘッダーはそれをブラウザに伝えます。
AJAX は常に utf-8 を使用します。

したがって、ページに単一のエンコーディング (utf-8) を使用するか、ajax 呼び出しを通常の呼び出しと区別する必要があります。

フラグメントについては、フラグメント値を使用してサーバーに送信しないでください。JS 変数を用意し、それを 2 回使用して、フラグメントを設定し、JSON を使用してサーバーに送信します。

于 2010-07-30T03:33:32.140 に答える
0

URL は特定の ASCII 文字に制限されています。URL に適していない文字は、URL エンコードされているはずです (表示される %hh エンコード)。一部のブラウザーは、addr 行に表示される URL を自動的にエンコードする場合があります。

于 2010-07-30T03:03:14.930 に答える
0

RFC 1738 は、英数字、特殊文字$-_.+!*'(),"、および予約文字;/?:@=&のみが URL 内でエンコードされないと述べています。それ以外はすべて、HTTP クライアント、つまり Web ブラウザによってエンコードされます。PHP がクエリ文字列を自動的にデコードするかどうかに関係なく、 rawurldecode() を使用できます。二重デコードに危険はありません。

于 2010-07-30T09:22:28.747 に答える