回答編集履歴

2 URLをURIに訂正ほか

ikedas

ikedas score 2942

2017/02/13 00:14  投稿

もしかして、これ?
---
HTMLでは、文字を表すのに「実体参照」を使えます。「``&名前;``」といった形式の表記です。``<``のように、HTMLの特殊文字とかぶる文字を表すのによく使いますね。
HTML4までの規格は[SGML](https://ja.wikipedia.org/wiki/SGML)に準拠していたので、実体参照の書式もそれに準拠していました。SGMLでは、まぎれがなければ実体参照の最後の``;``を省略していいことになっています。
そのため、注意しないと問題が起きることがあります。たとえばHTML中に次のような記述があった場合、
```html
<a href="?art&copy">Art and Copy</a>
```「``&copy``」は、その後に名前に使えない文字``"``があるため、「copy」という名前の実体参照``&copy;``として扱われます。その結果この記述は
```html
<a href="?art©">Art and Copy</a>
```を表すものと解釈されてしまいます。
```を表すものと解釈できてしまいます。
HTML5からはSGMLに準拠しなくなったので、実体参照の書式があらためられ、**最後の``;``は必須**となりました。文書に上記のような記述があれば、構文エラーとなります ([HTML5.1, §1.10.2. Syntax errors](https://www.w3.org/TR/html51/introduction.html#syntax-errors)「Errors involving fragile syntax constructs」.)。
上記の例での正しい方法は、URL中の「``&``」を次のように実体参照として記述することです。
上記の例での正しい方法は、URI中の「``&``」を次のように実体参照として記述することです。
```html
<a href="?art&amp;copy">Art and Copy</a>
```
# おまけ
上で説明した問題はHTML4でも指摘されていましたが、HTML4までは上述のとおり``;``を省略できてしまっていたので、解決策としてURLの**クエリの区切り文字に``&``ではなく``;``を使うことを推奨**していました ([HTML4.01, Appendix B.2.2. Ampersands in URI attribute values](https://www.w3.org/TR/html401/appendix/notes.html#h-B.2.2))。
上で説明した問題はHTML4でも指摘されていましたが、HTML4までは上述のとおり``;``を省略できてしまっていたので、解決策としてURIの**クエリの区切り文字に``&``ではなく``;``を使うことを推奨**していました ([HTML4.01, Appendix B.2.2. Ampersands in URI attribute values](https://www.w3.org/TR/html401/appendix/notes.html#h-B.2.2))。
実際、URLの構文解析をするモジュールなどは、多くが両方の区切り文字に対応しています。``;``を使えるフレームワークもあります。ただし使えるとは言っても、URLのクエリ部はサーバサイドで解析されるものなので、サーバサイドで対応していない区切り文字は認識できません。
実際、URIの構文解析をするモジュールなどは、多くが両方の区切り文字に対応しています。``;``を使えるフレームワークもあります。ただし、URIのクエリ部はサーバサイドで解析されるものなので、サーバサイドで対応していない区切り文字は認識できません。
たとえばQiitaでは、次のいずれでも検索ができます。
0. https://qiita.com/search?sort=stock&q=qiita
0. https://qiita.com/search?sort=stock;q=qiita
しかしTeratailでは、1. では検索できますが2. は正常に動作しません。
しかしTeratailでは、1. では検索できますが2. は期待通りに動作しません。
0. https://teratail.com/questions/search?search_type=and&q=teratail
0. https://teratail.com/questions/search?search_type=and;q=teratail
1 微修正

ikedas

ikedas score 2942

2017/02/11 18:06  投稿

もしかして、これ?
---
HTMLでは、文字を表すのに「実体参照」を使えます。「``&名前;``」といった形式の表記です。``&lt;``のように、HTMLの特殊文字とかぶる文字を表すのによく使いますね。
HTML4までの規格は[SGML](https://ja.wikipedia.org/wiki/SGML)に準拠していたので、実体参照の書式もそれに準拠していました。SGMLでは、まぎれがなければ実体参照の最後の``;``を省略していいことになっています。
そのため、注意しないと問題が起きることがあります。たとえばHTML中に次のような記述があった場合、
```html
<a href="?art&copy">Art and Copy</a>
```「``&copy``」は、その後に名前に使えない文字``"``があるため、「copy」という名前の実体参照``&copy;``として扱われます。その結果この記述は
```html
<a href="?art©">Art and Copy</a>
```を表すものと解釈されてしまいます。
HTML5からはSGMLに準拠しなくなったので、実体参照の書式があらためられ、**最後の``;``は必須**となりました。文書に上記のような記述があれば、構文エラーとなります ([HTML5.1, §1.10.2. Syntax errors](https://www.w3.org/TR/html51/introduction.html#syntax-errors)「Errors involving fragile syntax constructs」.)。
上記の例での正しい方法は、URL中の「``&``」を次のように実体参照として記述することです。
```html
<a href="?art&amp;copy">Art and Copy</a>
```
# おまけ
上で説明した問題はHTML4でも指摘されていましたが、HTML4までは上述のとおり``;``を省略できてしまったので、解決策としてURLの**クエリの区切り文字に``&``ではなく``;``を使うことを推奨**していました ([HTML4.01, Appendix B.2.2. Ampersands in URI attribute values](https://www.w3.org/TR/html401/appendix/notes.html#h-B.2.2))。
上で説明した問題はHTML4でも指摘されていましたが、HTML4までは上述のとおり``;``を省略できてしまっていたので、解決策としてURLの**クエリの区切り文字に``&``ではなく``;``を使うことを推奨**していました ([HTML4.01, Appendix B.2.2. Ampersands in URI attribute values](https://www.w3.org/TR/html401/appendix/notes.html#h-B.2.2))。
実際、URLの構文解析をするモジュールなどは、多くが両方の区切り文字に対応しています。``;``を使えるフレームワークもあります。ただし使えるとは言っても、URLのクエリ部はサーバサイドで解析されるものなので、サーバサイドで対応していない区切り文字は認識できません。
たとえばQiitaでは、次のいずれでも検索ができます。
0. https://qiita.com/search?sort=stock&q=qiita
0. https://qiita.com/search?sort=stock;q=qiita
しかしTeratailでは、1. では検索できますが2. は正常に動作しません。
0. https://teratail.com/questions/search?search_type=and&q=teratail
0. https://teratail.com/questions/search?q=teratail;search_type=and
0. https://teratail.com/questions/search?search_type=and;q=teratail

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る