[7] [[URN名前空間]] [DFN[[CODE(URI)[urn:publicid:[VAR[*]]]]]] 
は、 [[SGML]] などで使われる[[公開識別子]]を [[URL]]
として表現するためのものでした。 [[RFC 3151]] で定義されていました。

[9] 
元々ほとんど使われていませんでしたが、 [[SGML]] と [[XML]] の衰退により、
[[公開識別子]]自体も使われなくなりました。

* 仕様書

[REFS[
- [13] [CITE@en[[[RFC 3151]] - A URN Namespace for Public Identifiers]], [TIME[2021-04-11T09:01:35.000Z]], [TIME[2021-04-22T08:58:24.564Z]] <https://tools.ietf.org/html/rfc3151>
]REFS]

* 処理

[10] [[RFC 3151]] には特に書いてありませんが、実装する時には、
[[公開識別子]]に使えない文字が入力に含まれていた時の扱いに注意しないといけないでしょう。
実装の種類によって、

- そのような入力があった時点で[[致命的誤り]]とするか、
- そのような文字は削除してから [[URN]] 化するか、
- そのような文字は [[URI符号化]]するか

... を決めて、それを実装しておくのが良いでしょう。

[11] それとは逆に、解釈する (URI から公開識別子に変換する) 
側の実装にも誤り対処が必要です。

- (a) 公開識別子として不正な文字が含まれている場合,
- (b) [CODE(URI)[++]] とか [CODE(URI)[%2F%2F]] のように 
[CODE(URI)[publicid]] URN としてあり得ないはずの文字列が含まれている場合

... の対処を考える必要があります。 (普段は (b) 
は無視して素通ししてもいいかもしれません。 (a) 
は致命的誤りとするか、削除する必要があるでしょう。)

* 評価

[14] 
結局あまり使われなかったのは、
[[SGML]]
や
[[XML]]
が衰退したのもありますけど、
そもそも需要がなかったのでしょうね。

[15] 
[[公開識別子]]が求められる場面では、そのままオリジナルの[[公開識別子]]を使えばよく、
わざわざ [[URL]] に変換しても何も得することがない。

[16] 
[[URL]] が求められる場面では、一般的な [[URL]] を使えばよく、
わざわざ[[公開識別子]]を変換して使うメリットが何もない。
どころか、変換してわかりにくくなるデメリットがある。

[17] 
[[URL]] だけが求められる場面で[[公開識別子]]を統一的に扱いたく、
[[公開識別子]]専用の別の仕組みを導入するのが躊躇されるとき、
本手法によって変換した [[URL]] を扱えば便利。
でもそんな場面はなかった。
元から[[公開識別子]]が想定される場面 (たとえば[[カタログ]]の記述)
なら、[[公開識別子]]のまま書ける方が便利に決まっているので、
わざわざ [[URL]] だけに限定する理由はない。
元から [[URL]]
だけを使っていて後から[[公開識別子]]が必要になる理由も何もなかった。

* 関連

[12] 
[[XML型録]]の[[URLの解決][URLの解決 (XML型録)]]や[[外部識別子の解決]]の処理では、
本項の [[URL]] は[[公開識別子]]に変換されて処理されることになっていました。

* 歴史

[8] 
[[RFC]] になる前の [[I-D]] は [DFN[draft-urn-publicid]] でした。

[1] 
[[RFC 3151]]

* メモ