AJAX、「キリル文字」、エンコーディング、prototype.js、jQuery、JsHttpRequestを一度に把握します。

AJAXはテクノロジーです。 この技術で一般的に使用される技術の1つは
クラスXMLHttpRequestのオブジェクトを使用してリクエストを送信します。

必要なエンコーディングでAJAXリクエストを送受信する方法。シングルバイトエンコーディングを使用する必要があるかどうか、UTF-8なしで行うかどうか。 これらの質問はすべて、この記事で一度だけ答えられます。



ちなみに、 私の再版。

もちろん、JavaScriptにはクラスはありませんが、便宜上、この用語を使用します。

XMLHttpRequestのドキュメントには、ブラウザが次のタイプをサポートする必要があると書かれています
HTTPリクエスト:GET、POST、HEAD、PUT、DELETE、OPTIONS。

現在までに、クラスXMLHttpRequestのオブジェクトを介してJavaScriptを送信できます。
GETやPOSTなどのリクエストのみ

したがって、次の2つのクエリを検討してください。

1.リクエストタイプGET:

サーバー上のスクリプトへのすべての情報は、URLおよびヘッダーを介してのみ送信できます。

例えば

-rebenok / ajax.phpを取得しますか?F = 324
ホスト:moy-rebenok
ユーザーエージェント:Mozilla / 5.0(Windows; U; Windows NT 5.1; ru; rv:1.8.1.11)Gecko / 20071127
Firefox / 2.0.0.11
受け入れる:
text / xml、application / xml、application / xhtml + xml、text / html; q = 0.9、text / plain; q = 0.8、image / pn
g、* / *; q = 0.5
Accept-Language:ru-ru、ru; q = 0.8、en-us; q = 0.5、en; q = 0.3
Accept-Encoding:gzip、deflate
Accept-Charset:windows-1251、utf-8; q = 0.7、*; q = 0.7
キープアライブ:300
接続:キープアライブ
リファラーmoy-rebenok / ajax.html

サーバーでは、ajax.phpで次の構成を使用できます。
$ _GET ['f']変数fの値を取得します。

ロシア語の文字に問題があるのはなぜですか? ご存じのとおり、ロシア語の文字はURLで使用できないため、「?」記号の後のURLで使用可能なラテン文字、数字、文字を使用して送信する必要があります。

人々は、エスケープシーケンスを使用してこれを行うことに同意しました。

windows-1251によってエンコードされた単語「hi」のエスケープシーケンス:
%EF%F0%E8%E2%E5%F2

UTF-8エンコーディングの「hello」という単語のエスケープシーケンス:
%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82

KOI8-Rでエンコードされた単語「hi」のエスケープシーケンス:
%CE%CF%D5%C1%C5%D0

(記号は「%」、次に文字コードです)。

したがって、たとえば次のようにロシア文字を転送できます。

-rebenok / ajax.phpを取得しますか?F =%EF%F0%E8%E2%E5%F2
ホスト:...

または:

-rebenok / ajax.phpを取得しますか?F =%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82
ホスト:...

誰もあなたをこれに制限しません

ところで、GET要求の場合、Content-Typeヘッダー指定する必要はありません
なぜなら コンテンツなし。 特定のアドレスにのみリクエストがあります。
サーバーへのすべての変数はURLを介して渡されます。

必要なコーディングで必要なエスケープシーケンスを作成する方法は?

少なくとも何らかの方法で手でいじることができますが、当然JavaScriptで行います。
繰り返しますが、誰もあなたを制限しません。

ただし、便宜上、通常はJavaScriptで既に定義されている3つの関数のいずれかを使用します。

a)エスケープ()
b)encodeURI()
c)encodeURIComponent()

順番に:

a)エスケープ()

ラテン文字、数字、記号@ * / +。 そのままにすると、他のすべては次のようにエンコードされます。
%xxなど:%uxxxx。
さらに、2番目の場合のxxxxは、UTF-8ではなくUnicodeの文字コードです

UnicodeとUTF-8の違い )。

この関数を使用する必要はありません。 実行の結果はブラウザに依存し、機能は標準化されたW3Cではなく、90年代に発生しました。

さらに、サーバー上でこのようなビニールのような形式の文字列を処理することは、何らかの方法で(少なくとも迅速に)困難です。

エスケープ()関数は、同胞のJsHttpRequestライブラリで使用されます。
ライブラリが悪いからではなく、すべてのブラウザで動作するように設計されているからです
(最古のものを含む)。

b)encodeURI()

ラテン文字、数字、記号!@#$&*()=:/ ;? + ' そのままに、他のすべて
エンコードする
UTF-8エンコードされたエスケープシーケンス。

c)encodeURIComponent():

ラテン文字、数字、記号!*() '。 そのままにして、他のすべてをエンコードします
UTF-8エンコードされたエスケープシーケンス。
W3Cによって承認されました。

GETメソッドでクエリを実行するときに、jQuery、prototype.jsによって使用されます。

「XMLHttpRequestはUTF-8でのみ機能します」という話を聞いたことがあるかもしれません。
これで完全に真実ではないことがわかります。

GET要求が使用される場合、送信されたデータのエンコードは通常どこにも登録されません(!)。
もう一度、「Content-type」では、文字セットを指定できます
GETリクエストでは使用さません

しかし、なぜなら JavaScriptには、UTF-8のエスケープシーケンスを使用して任意の文字列を文字列に変換するための2つの便利な関数があり、それらはすべてそれを使用してUTF-8で動作します。

そのため、jQueryでは、リクエストを送信するときに文字セットを指定することさえできません。
そのため、Prototype.jsでは、encoding = 'windows-1251'を指定してGETリクエストを使用した場合でも、UTF-8が送信されます。

これらのライブラリのコードがencodeURIComponent()関数を使用しているという理由だけで。

じゃあ それは絶対に悪いことではありません。 今すぐ仕事をするために必要なこと
PHPで
通常のエンコードはiconvを使用します:

$ f = iconv( 'UTF-8'、 'windows-1251'、$ _GET ['f']);

ところで、$ _GETが理解できるように機能するため、これを正確に行うことができます
エスケープシーケンス。 PHPの作成者に感謝します。

つまり GETリクエストが到着すると、PHPはURLを見て、$ _GET配列を作成し、
すでに彼と一緒に
私たちがしたいことは私たちがやることです。 しかし、それは明らかなようです。

2)POSTリクエスト。

ここではすべてがより興味深いものです。

サーバーへのこのリクエストが来ます。 PHPハンドラーはContent-typeを調べ、それに応じて$ _POST配列および/または$ HTTP_RAW_POST_DATA変数を埋めます。

Content-typeでmultipart / form-dataが指定されている場合、または$ _POSTを埋めます。
x-www-form-urlencoded。

これはどのような種類のコンテンツですか?
また、コンテンツの入力は非常に便利です。 これにより、いくつかの変数をphpスクリプトに渡すことができます。

POSTリクエストとは何ですか?
これらが見出しであり、その後にコンテンツが続きます。 通常、コンテンツは任意です。 つまり ただのバイト、バイト、バイト。

しかし、結局のところ、JavaScriptからは通常、バイト、バイト、バイトだけでなく、いくつかのキー=値のペア、キー=値、...を送信する必要があります。
GETリクエストのように。

したがって、人々はx-www-form-urlencodedのような便利なタイプに同意しました
f = 123およびgt = nullを渡すには、コンテンツを渡す必要があります。

f = 123&gt = null

真実を知っていますか? もちろん、おなじみであり、タイプはx-www-form-urlencodedと呼ばれる無駄ではありません。
すべてがGETリクエストの場合と同じです。

また、jQueryおよびprototype.jsライブラリでコンテンツはどのように形成されますか?

同じ関数encodeURIComponent()の助けを借りて、それは事実であり、したがって、エスケープシーケンスはUTF-8エンコーディングになります。 (prototype.jsにエンコードをインストールするという事実に関係なく)。

それだけです もう1つの機会があります。 結局のところ、x-www-form-urlencodedではなく(つまり、パラメーターではなく)通常のテキストまたはバイナリコンテンツを転送することは可能であり、これらは$ HTTP_RAW_POST_DATAを介して読み取ることができます。

これを行うには、Content-type text / xmlまたはapplication / octet-streamを同じ場所に設定し、charset = "windows-1251"を設定します。

send()関数に、目的のエンコーディングの文字列を入れます。 (Prototype.jsは、この呼び出しを新しいAjax.Request(...)コンストラクトでラップします。

そして...そして、彼(XMLHttpRequestクラスのオブジェクト)は、この文字列をエンコード方式に関係なくUTF-8に変換します。 これがW3Cのドキュメントに書かれていることです。 そして彼は本当にそれをします。

結論:

1. UTF-8でエンコードされた文字列のみが、XMLHttpRequestを介して直接送信できます。

2.非ラテン文字の場合、「他のエンコーディング」のように文字列を送信できます
脱出と同時に。

3. JavaScriptには、非ラテン文字をエスケープする3つの関数があります。
escape()、encodeURI()およびencodeURIComponent()。

最初のものはUnicode曲線に変換されます。 UTF-8の2番目の2つ。

任意のエンコーディングのエスケープシーケンスを生成する独自の関数を作成できます。 可能ですが、必須ではありません。 なぜなら それどころか、 エンコーディングのテキストをUTF-8に変換するような関数があることを嬉しく思うはずです。 これは非常に美しい事実です。 すべてのxhtmlページがwindows-1251で動作し、ajaxがサーバーからクライアントにwindows-1251をスローし、ajaxがクライアントからサーバーにUTF-8をスローするスキームは、 絶対に受け入れられ、ほとんどのリソースで使用されます。

下記の説明に従ってiconvを使用することを忘れないでください。 そして、サーバーが正しいエンコーディング(つまり、すべてのxhtmlページがレンダリングされる同じエンコーディング)でJSONをjavascript(またはあなたが持っているもの)に与えるために、ajax.phpの先頭にヘッダーを書くだけです:

header( 'Content-type:text / html; charset = windows-1251');

そして、すべてが大丈夫です。

最後に、少し主観的な意見:

jQueryを使用し、人々を愛し、贈り物をします。

Source: https://habr.com/ru/post/J17640/


All Articles