Search

検索したいワードを入力してください

2019年01月18日

PHPのurlencode関数で文字列をエンコードする方法

PHPのurlencode関数の使い方を解説しています。urlencode関数とは何か?そもそも何故urlencode関数が必要なのか?使う際の注意点は?など、urlencode関数を使う際に役立つ関連知識についても解説しています。

エンコードとは?

エンコードとは符号化とも呼ばれ、一般的にはコンピュータで扱うデータを特定の方法で変換することです。エンコードを施すことで、圧縮やバイナリデータの文字列変換など、目的に応じた形式に変換することができます。

ここではPHPで各種データを文字列にエンコードをするurlencode関数の使い方を学んでいきましょう。まずは代表的なエンコードの種類をご紹介します。

エンコードの種類

URLエンコード

URLエンコードとは、文字列をURLで扱うことのできる形式に変換するエンコード方式のことです。URLに使用できる文字の種類は国際規格RFCにより決められています。数字、大文字小文字アルファベット、一部の記号です。


  • ラテン小文字(小文字アルファベット): a~z
  • 数字: 0~9
  • ハイフンマイナス: -
  • アンダーライン: _


これ以外の記号、あるいは日本語などの非アルファベット文字を使用する場合は「パーセント・エンコーディング」という方式に基づいて変換することでURLとして使用することができます。記号とコードの対応は以下のようになっています。

記号コード
(半角スペース)%20
!%21
"%22
#%23
$%24
%%25
&%26
'%27
(%28
)%29
*%2A
+%2B
,%2C
-%2D
.%2E
/%2F
:%3A
;%3B
<%3C
記号コード
=%3D
>%3E
?%3F
@%40
[%5B
\%5C
]%5D
^%5E
_%5F
`%60
{%7B
|%7C
}%7D
~%7E

日本語などの非アルファベット文字の場合は、特定の文字コードでエンコーディングされた後、記号と同じようにパーセントが先頭に付与されます。多くの場合、文字コードには「UTF-8エンコード」が使用されます。

PHPのurlencode関数は、基本的にはこの「URLエンコード」方式の変換をしてくれる関数であるということです。

UTF-8エンコード

UTF-8エンコードとは文字を識別するためのエンコード方式のひとつです。

歴史的に、コンピュータ内部では英数字と記号による文字集合としてASCIIコードが広く使用されてきました。このASCIIコードのみでは日本語のような非アルファベット文字を表現できません。そのため、それらを扱うために多種多様なエンコード方式が存在しています。

その中でも、日本語だけでなく全世界のあらゆる文字集合の定義として「Unicode」という規格が決められています。このUnicode文字集合をどのようにエンコード(符号化)するか?という方式を定めたエンコード方式の中で、最も広く使用されているものが「UTF-8エンコード」という符号化方式です。

UTF-8エンコードの最も特徴的な点は、前述のASCIIコードとの互換性がある、という点です。UTF-8はASCIIの拡張であり、ASCIIコードはそのまま変換方式を変えずに表すことが可能です。

base64エンコード

base64エンコードとは、バイナリデータを印字可能な英数字記号のみに変換するエンコード方式のことです。

具体的にはASCIIコードである大文字、小文字アルファベットと数字、それからプラス「+」とスラッシュ「/」記号のみに変換されます。文字列ではない画像などのバイナリデータを文字列のみで表すことができるよう規定された符号化方式です。

HTMLテキストで画像などを表すときなどに使用されますし、印字可能な文字列であるためURLのパラメータにも使用するすることが可能です。

HTMLエンコード

HTMLエンコードとは、文字列をHTMLで扱うことのできる形式に変換するエンコード方式のことです。

HTMLもURLと同じように、文字列のみで構成されるデータです。画像などのバイナリデータをそのまま表すことはできません。

また、HTML専用で使われる文字(予約語と呼びます)、例えば「<」や「>」のような文字はそのままHTML内部で使用することはできません。

そのためHTML内部で文字列を使用するためにはURLなどと同じように特定のエンコーディング方式によって符号化する必要があります。この方式のことをHTMLエンコードといいます。

PHPのurlencode関数の使い方にこのHTMLエンコードがどう関係するのか説明をするのか?といいますと、HTMLテキスト内にはURLがたびたび登場するからです。アンカータグ(<a>)などが代表的です。

つまり、URLをHTMLテキスト内で記述したい場合、まず「URLエンコード」してから、その文字列を「HTMLエンコード」する必要があります。

PHPでは、「htmlentities」という関数でHTMLエンコードを施すことができます。

PHPのurldecode関数

さて、ここからは実際のPHP関数についてご説明していきましょう。urlencode関数の前に、urldecodeという関数をご紹介します。

冒頭でご説明したように、エンコードによって変換したデータは、特定の方式によって変換前のデータに戻すことができます。これをデコード(複合化)といいます。

urldecode関数は、URLエンコードされた文字列を元の文字列に変換することができる関数です。

これによって、PHPプログラムの処理で必要なパラメータをURLにエンコードして埋め込み、受け側のPHPプログラムでデコードして処理することができるようになります。以下のように使用します。

urldecode($エンコードした文字列)

urlencodeによるエンコード

さあ、ではurlencode関数の具体的な使い方をご紹介しましょう。使い方はいたってシンプルです。urldecodeのときと同じように使います。

urlencode($エンコードする文字列)

これで、前述した「URLエンコード」方式の変換を自動的に施してくれます。

urlencodeで文字コードを指定する

通常はurlencode関数を使用するだけでURL用の文字列に変換できます。ですが、エンコードする文字列に日本語のような非アルファベット文字が含まれている場合は、往々にしてURL指定先のPHPプログラムで文字化けなどの問題を引き起こしがちです。

それは、PHPのプログラムをどの文字コードで記述しているか?に関係してくるからです。

同じ文字列でも文字コードが違うと別の結果になる


もし、元のエンコードする文字列が「あいうえお」で、その文字列がUTF-8文字コードで記述されていたならば、

%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A


urlencodeではこのように出力されます。もしこれが日本語専用の文字コードとして代表的なShift-JISであった場合は、

%82%A0%82%A2%82%A4%82%A6%82%A8


このように、同じ日本語の「あいうえお」でも、文字コードが違えばURLエンコードの結果は変わってきます。

ですので、非アルファベット文字を使うプログラム内では、どの文字コードを共通して使うのか取り決めをしておかなくてはなりません。

その上で、まずは日本語などの非ASCII文字列を指定文字コードに変換した後に、urlencodeにかける、という手順を踏むと問題が起こりにくくなります。

文字コードを変換してURLエンコードする

ではどのように文字コードを変換してURLエンコードするのか見ていきましょう。

文字コードを変換した後、URLエンコードするという手順を踏みます。文字コードを変換するには、mb_convert_encoding関数を使用します。

mb_convert_encoding($変換する文字列, $変換後の文字コード, $変換前の文字コード)

例えば先ほどのように「あいうえお」をUTF-8に変換したいのであれば、
mb_convert_encoding("あいうえお", "UTF-8", "auto")
のように指定します。

この例では、"auto"を指定することで、PHPプログラム上で「あいうえお」がどの文字コードで記述されていたとしても自動判別できるようにしています。確実に分かっている場合は"SJIS"などのように指定することもできます。

そして変換後の文字列をurlencode関数に指定すれば、前述のように元の文字列の文字コードの違いによって結果が変わることを防ぐことができます。

urlencodeとrawurlencodeの違い

ここで、PHPのurlencodeに良く似たrawurlencode関数についてご紹介します。

urlencode関数は、既に広く使用されているシステムに合わせるためなどの歴史的な理由により、あえて正規のRFC規格と異なる変換を施します。

具体的には半角スペースのエンコード文字が規格とは異なっています。urlencode関数と違い、正しくRFC規格どおりに変換するのがrawurlencode関数です。

通常はurlencodeのみ使用して問題ないでしょう。

まとめ

  • PHPではURL文字列を指定する際にはurlencode関数を使って正しく変換しましょう
  • URL文字列をHTML内で使用する際にはHTMLエンコードに変換しましょう
  • URL文字列に日本語など非ASCII文字がある場合は文字コード変換してからURLエンコードしましょう

文字列のエンコードとデコード、urlencodeとrawurlencodeの違いを見てきました。文字コードの問題は、csvファイルの文字化けなど、日常の中でも発生することもあるものです。

文字コード指定を使いこなして、データやシステムを使いこなしましょう。

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related