コピー2019.01.03スポンサーリンク目次はじめにPHPのURLエンコードについて文字コードについてURLエンコードについてURLデコードについてJavaScriptのURLエンコードについて文字コードについてURLエンコードについてURLデコードについてリンデンスクリプト言語はじめにURLエンコードについてURLデコードについておわりに文字コードについてURLエンコードの方法はじめにこんにちはー!今日は、URLエンコードの勉強をしたいと思います。今なのかというと、最近IoT関係でデータを渡したりやりとりするさいにGETをよく使うのですが、このような場合にURLエンコードを使いたいからです。いうわけで、仕様とか含めて調査していきます。PHPから調査してみます。PHPのURLエンコードについて文字コードについてはじめにPHPには、URLエンコードをする関数が用意されています。これを使えばURLエンコードができると思うのですが、変換する前の文字コードってどうなるんだという素朴な疑問点がうかびました。いうわけで先に文字コードについて調査してみます。以下のURLエンコード用の関数を確認します。デフォルトの文字コードを調査ソースコードの文字コードは、UTF-8(BOM無し)で保存。/>";?>これをWebサイトで表示させました。0x82」なので、UTF-8の文字コードを変換していることがわかります。UTF-8になっていたため、実験1のような動作になった可能性があります。いうわけで、次は以下のようなコードを、Shift_JIS(Windows-31J)で保存。/>";?>php.iniも一応以下のように変更。mbstring.language=Japanesembstring.detect_order=SJISmbstring.internal_encoding=SJISmbstring.http_output=SJISmbstring.encoding_translation=OnこれをWebサイトで表示させました。あいうえおabc+%82%A0%82%A2%82%A4%82%A6%82%A8abc%20%82%A0%82%A2%82%A4%82%A6%82%A8HTMLのウェブサイトの文字コードは、Shift_JIS(Windows-31J)となり、文字のURLエンコードも「あ」が「%82%a0」つまり「0x82a0」から、Shift_JISでエンコードされたことが分かります。結果phpのURLエンコードは、phpの文字コードによって変化することが分かりました。デフォルトはUTF-8なので、通常はUTF-8を使っていればいいですが、もしShift_JISのphpに対してデータを送りたい場合は、Shift_JISで変換する必要があるようです。現在はそのようなサイトは数少ないと思うため問題ないとは思いますが、確認できるなら確認したほうがよいと思われます。URLエンコードについてはじめにいよいよURLエンコードがどのように変換されるか調べてみましょう。関数の解説サイトには次のような説明がありました。3986にそっている。1738にそっている。urlencodeとの違いは、urlencodeはRFCに対して厳密ではなく、スペースが%20ではなく+記号に置き換わるとのことです。実際に動作させて変換後の結果をみてみましょう。%7F結果URLエンコードをすることで、制御文字はほぼ変換されました。変換されていない記号は以下の通り。+(※rawurlencodeでは変換される)-(ハイフン).(ドット)_(アンダーバー)~(※rawurlencodeでは変換されない)URLデコードについてurlencodeとrawurlencodeの互換性を調べたいと思います。デコードを組み合わせて以下のコードで確認しました。""+""~""~"このようになりました。+に関しては、rawurldecodeで元に戻せません。urlencodeで変換した文字は、rawurldecodeで元に戻せないことなります。逆なら大丈夫なので、urldecodeであれば問題ありません。urlencodeかrawurlencodeか、どちらを使えばいいのでしょうか。これについては、最後に記載したいと思います。変換したいと考えるユーザーもおられるでしょう。抜粋と記載があります。するという決まりがあるのです。そのため、urlencodeによるエンコード方法は非推奨とかではなく、普通に利用されている関数なのです。JavaScriptのURLエンコードについて文字コードについてはじめにデータを渡す際などに利用するJavaScriptの動作を調べてみましょう。JavaScript用のURLエンコード用関数を確認します。デフォルトの文字コードを調査htmlの文字コードは、UTF-8(BOM無し)で保存。結果は、abc%20%u3042%u3044%u3046%u3048%u304Aabc%20%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8Aabc%20%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A=abc+あいうえおescapeでは、「あ」を0x3042に変換しています。これはどうやらUTF-16になっているようです。サロゲートペアのツチヨシ「𠮷」を試してみましょう。=%F0%A0%AE%B7escapeではやはり、UTF-16を使用しているようです。encodeURI、encodeURIComponent、URLSearchParamsは、UTF-8を使用しています。HTMLの文字コードを変えた場合phpと同じように、ファイルの文字コードの依存する可能性があるため確認します。以下のようなコードを、Shift_JIS(Windows-31J)で保存。結果は、abc%20%u3042%u3044%u3046%u3048%u304Aabc%20%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8Aabc%20%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A=abc+あいうえおChromeですが文字エンコードに失敗しているようです。原因について分かりませんでした。Edgeに関しては、UTF-8で変換しているようです。Endianで試しました。=abc+%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A上記の結果から、HTMLの文字コードは関係なく、UTF-8に変換されることが分かりました。結果escapeについては非推奨なので、動作は分からないです。encodeURI、encodeURIComponent、URLSearchParamsに関していえば、UTF-8に変換してくれます。Chromeの動作を考えると、HTMLを記載する際は、Unicodeを使ったほうがよさそうです。URLエンコードについてはじめにescape、encodeURI、encodeURIComponent、URLSearchParamsがどのように変換するか確認します。%7F結果encodeURIは、記号のいくつかが変換されていません。これは、URL上で特別な意味を持つため、変換するとURLとしての特別な意味をなくしてしまいます。これはどういった場面を想定しているのでしょうか。URL全体のデータに対して、エンコードした後に、エンコード後のURLに対してアクセスまで行うといったことを想定しているのかもしれません。encodeURIComponentは、&などURL上で特殊な意味をもつ記号も変換されています。GETなどでデータを入れるように文字列を変換したいという場合を想定しています。+に変換していたり、チルダを%7Eに変換するなど一部動作が異なる処理をしています。これはPHPのurlencodeと同一の動作となっております。URLデコードについて本当は比較のためにURLSearchParamsを使って、URLデコードをしたかったのですが、よくわからなかったので以下のような感じで調査します。"%20")のように、+をスペースに置換後に関数にかけるという手がよいかもしれません。Language)でも確認してみました。URLエンコードについてスクリプト以下を実行します。ASCIIコードから文字への変換関数がなかったので、作りました。%7F※NUL文字はLSL上では利用できないため変換を確かめることができませんでした。結果は+に変換せず、そのまま%20にURLエンコードしています。URLエンコードしておけば、元のスペースに戻るので特に気にする必要はありません。URLデコードについてデコードの方も少し確認してみました。_+_llEscapeURLの仕様から+は+のままですね。+に変換してしまうと元に戻せなくなるので注意が必要です。おわりに今回、PHPとJavaScriptとLSLのURLエンコードについて実際の動作を確認してみました。以下、結論となります。文字コードについてURLエンコードにおいては、JavaScriptの仕様からUTF-8が基本となるようです。PHPは、ソースコードの文字コードによって内部動作が変わるため、必ずUTF-8を使用したほうがよいです。Chromeに至ってもURLエンコードが正しく動作しない可能性があるため、HTMLの文字コードはUTF-8を使用しましょう。送信先の仕様が分かっているのであれば、方式を合わせるのが最も良いです。+に変換、チルダを%7Eに変換する方法をとりましょう。"+")のようなものを挟み込んでおけばよいと思われます。データをURL上でやりとりしたいという理由であれば、以下の関数を使いましょう。encodeURIComponent及び、decodeURIComponent一部SQLなどに直接食わせたりすると危険な文字列とかあるので、デコード後は必要に応じて加工が必要かと思います。PHPスポンサーリンクプロフィールなたで明るくて楽しいことが好きです。[...]セカンドライフ制作セカンドライフでプログラム1(書き方がC言語に似ているよ編)コンニチハ。最近、セカンドライフやりだした。今から6年前の2008年5月の「ネトゲ日記-1」ですね。[...]セカンドライフ制作セカンドライフでプログラム6(臨時プリム編)臨時プリムの動きについて、ここでおさらいしたいと思います。次のプログラムを見てみてください。stateを使った状態遷移と、touch_startを使ったプログラムとなっています。どのように動くか想像できますでしょうか。今回は、パーティクルシステムについてのお話です。いうか、自分用のメモです。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。目次はじめにPHPのURLエンコードについて文字コードについてURLエンコードについてURLデコードについてJavaScriptのURLエンコードについて文字コードについてURLエンコードについてURLデコードについてリンデンスクリプト言語はじめにURLエンコードについてURLデコードについておわりに文字コードについてURLエンコードの方法タイトルとURLをコピーしました。