[1] [DFN[[CODE(URI)@en[[[news:]]]]]] と [DFN[[CODE(URI)@en[[[nntp:]]]]]]
は、[[USENET]] [[ネットニュース]]を表す [[URL scheme]] です。
元々は [CODE(URI)@en[[[news:]]]] が[[プロトコル]]非依存の記事、 
[CODE(URI)@en[[[nntp:]]]] が [[NNTP]] を表していたようですが、
次第に区別が曖昧となり、実装によっては同義として扱っているようです。

[33] また [DFN[[CODE(URI)@en[[[snews:]]]]]] は、
[[NNTP]] over [[SSL]]/[[TLS]] を表していましたが、[[歴史的]] [SRC[>>5]]
とされています。

[4] [[ネットニュース]]の衰退により、現在ではほとんど使われなくなっています。

* 仕様書

[REFS[
- [5] [CITE@en[RFC 5538 - The \x27news\x27 and \x27nntp\x27 URI Schemes]] ([TIME[2014-11-02 16:28:57 +09:00]] 版) <http://tools.ietf.org/html/rfc5538>
]REFS]

[37] [[RFC 5538]] は実際に使われている [[URL]] の一部のみしかカバーしていないようですが、
その範囲がどのように選ばれたのかは明確ではありません。複数の実装があっても [[RFC]]
に含まれていない構文もあれば、実装されていないことがあっても [[RFC]]
には含まれている構文もあるようです。

* 構文

** 記事のメッセージID

[17] [CODE(URI)@en[[[news:]]]] と[[メッセージID]]を指定することで、
(特定の[[鯖]]に限定されない) 記事を表します [SRC[>>5]]。

[FIG(railroad)[
= |
== [CODE(URI)@en[[[news:]]]]
== [CODE(URI)@en[[[snews:]]]]
= [[メッセージID]]
]FIG]

[21] アクセス時には、設定による既定の[[鯖]]を使います [SRC[>>5]]。

** ニュースグループ

[18] [CODE(URI)@en[[[news:]]]] と[[ニュースグループ]]の名前を指定することで、
(特定の[[鯖]]に限定されない) [[ニュースグループ]]群を表します [SRC[>>5]]。

[FIG(railroad)[
= |
== [CODE(URI)@en[[[news:]]]]
== [CODE(URI)@en[[[snews:]]]]
= [[ニュースグループ]]群
]FIG]

[22] アクセス時には、設定による既定の[[鯖]]を使います [SRC[>>5]]。

** 鯖と記事のメッセージID

[19] [CODE(URI)@en[[[news:]]//]] と[[鯖]]と [CODE(URI)[[[/]]]]
と[[メッセージID]]を指定することで、
特定の[[鯖]]の記事を表します [SRC[>>5]]。

[FIG(railroad)[
= |
== [CODE(URI)@en[[[news:]]//]]
== [CODE(URI)@en[[[snews:]]//]]
= [[authority]]
= [CODE(URI)[[[/]]]]
= [[メッセージID]]
]FIG]

** 鯖とニュースグループ群

[20] [CODE(URI)@en[[[news:]]//]] と[[鯖]]と [CODE(URI)[[[/]]]]
と[[ニュースグループ]]の名前を指定することで、
特定の[[鯖]]の[[ニュースグループ]]群を表します [SRC[>>5]]。

[FIG(railroad)[
= |
== [CODE(URI)@en[[[news:]]//]]
== [CODE(URI)@en[[[snews:]]//]]
= [[authority]]
= [CODE(URI)[[[/]]]]
= [[ニュースグループ]]群
]FIG]

** 鯖とニュースグループ

[7] [CODE(URI)@en[[[nntp:]]//]] と [[authority]] と [CODE[[[/]]]] と[[ニュースグループ]]の名前を指定することで、
特定の[[鯖]]の[[ニュースグループ]]を表すことができます [SRC[>>5]]。

[FIG(railroad)[
= [CODE(URI)@en[[[nntp:]]//]]
= [[authority]]
= [CODE(URI)[[[/]]]]
= [[ニュースグループ]]
]FIG]

** 鯖とニュースグループと記事番号

[7] [CODE(URI)@en[[[nntp:]]//]] と [[authority]] と [CODE[[[/]]]] と[[ニュースグループ]]の名前と
[CODE[[[/]]]] と記事番号を指定することで、
特定の[[鯖]]の[[ニュースグループ]]に含まれる記事を表すことができます [SRC[>>5]]。

[FIG(railroad)[
= [CODE(URI)@en[[[nntp:]]//]]
= [[authority]]
= [CODE(URI)[[[/]]]]
= [[ニュースグループ]]
= [CODE(URI)[[[/]]]]
= 記事番号
]FIG]

* 鯖

[11] [[authority]] が[[鯖]]を表します [SRC[>>5]]。

;; [[RFC 3986]] が参照されています [SRC[>>5]]。

[36] [CODE(URI)@en[[[snews:]]]] の[[既定のポート番号]]は [[119]] です。

[34] [CODE(URI)@en[[[snews:]]]] の[[既定のポート番号]]は [[563]] です [SRC[>>5]]。

* ニュースグループ

[10] [CODE(URI)@en[[[nntp:]]]] [[URL]] で指定する[[ニュースグループ]]は、
1つ以上の文字か[[パーセント符号化]]により表現します。
ここで文字は、[[ASCIIラテン文字]]、[[ASCII数字]]、
[CODE[[[-]]]]、[CODE[[[+]]]]、[CODE[[[_]]]]、[CODE[[[.]]]]
のいずれかです。 [SRC[>>5]]

[FIG(railroad)[
= +
== |
=== [[ASCIIラテン文字]]
=== [[ASCII数字]]
=== [CODE[[[-]]]]
=== [CODE[[[+]]]]
=== [CODE[[[_]]]]
=== [CODE[[[.]]]]
]FIG]

[14] [[RFC 5536]] ([[USEFOR]]) で認められている[[ニュースグループ]]名は、
[[パーセント符号化]]なしで表現できます。 [[RFC 3977]] ([[NNTP]])
では更にそれ以外の記号や[[非ASCII文字]]も使えますが、
それを表すには[[パーセント符号化]]が必要です。 [SRC[>>5]]

[26] [CODE(URI)@en[[[news:]]]] [[URL]] で指定する[[ニュースグループ]]群は、
[[RFC 3977]] [CODE(ABNF)@en[[[wildmat-pattern]]]] です。すなわち、
[[ニュースグループ]]の名前に加えて[[ワイルドカード]]である
[CODE[[[*]]]] と [CODE[[[?]]]] を使うことができます。 [SRC[>>5]]

[27] ただし [CODE[[[?]]]] は[[パーセント符号化]]が必要です [SRC[>>5]]。

[28] なお、 [[空文字列]]は、 [CODE[[[*]]]] と等価です [SRC[>>5]]。

[29] [[ワイルドカード]]がなければ、特定の[[ニュースグループ]]を表しており、
[[利用者エージェント]]は普通は記事一覧を表示します [SRC[>>5]]。

[30] [[ワイルドカード]]があれば、[[利用者エージェント]]は該当する[[ニュースグループ]]の一覧を表示できます [SRC[>>5]]。

;; [31] [[利用者エージェント]]によっては、 [[ワイルドカード]]無しの指定と
[CODE[[[*]]]] のみの指定にしか対応していません [SRC[>>5]]。

* 記事番号

[16] 記事番号は、1-16桁の[[ASCII数字]]で、 [[RFC 3977]] ([[NNTP]]) によるものです
[SRC[>>5]]。

[FIG(railroad)[
= +
== [[ASCII数字]]
]FIG]

* メッセージID

[23] [[メッセージID]]は、記事の [CODE(822)[[[Message-ID:]]]] [[ヘッダー]]のうち、
[CODE[[[<]]]] と [CODE[[[>]]]] を除いたもの ([[RFC 5536]]) です [SRC[>>5]]。

[24] ただし、 [CODE(ABNF)@en[[[gen-delims]]]] と [CODE[[[%]]]]
は[[パーセント符号化]]しなければ[['''なりません''']] [SRC[>>5]]。

[25] 解釈する[[エージェント]]は、すべての[[パーセント符号化]]を[[復号]]する必要があります
[SRC[>>5]]。

[32] なお、[[ニュースグループ]]と[[メッセージID]]は、
[CODE[[[@]]]] の有無によって区別します [SRC[>>5]]。[[メッセージID]]
には歴史的に [CODE[[[@]]]] が含まれることとなっています。
[[RFC 3977]] ([[NNTP]]) によれば [CODE[[[@]]]] が含まれることは要求されていませんが、
[[RFC 2822]] と [[USEFOR]] によれば記事の構文上は [CODE[[[@]]]] が要求されています。

* 歴史

[3] 
>
[PRE[
RFC 1738 にはありませんが、lynx 等と同じ様な以下の URL を
解釈する様にしました。
news: は、nntp: の <host>:<port> が、オプション nntpserver
(環境変数 NNTPSERVER) の値になる以外は nntp: と同じになります。
# lynx 等では、news://<host>:<port>/ とか <host>:<port> なしの
# nntp: も使える(news: と nttp: が完全に同じ)様だけど見送り。
[記事の取得]
    nntp://<host>:<port>/<newsgroup-name>/<article-number>  (RFC 1738)
    nntp://<host>:<port>/<newsgroup-name>/<message-id>
    nntp://<host>:<port>/<message-id>
    news:<newsgroup-name>/<article-number>
    news:<newsgroup-name>/<message-id>
    news:<message-id>  (RFC 1738)
[Newgroup の記事のリスト]
    nntp://<host>:<port>/<newsgroup-name>
    nntp://<host>:<port>/<newsgroup-name>/<start-number>-<end-number>
    news:<newsgroup-name>  (RFC 1738)
    news:<newsgroup-name>/<start-number>-<end-number>
推奨はしませんし、内部でも使わないようにしていますが、
news:<newsgroup-name>/<start-number>-<end-number> は使わざる
をえないので使っています。
# news:<newsgroup-name>#<start-number> にしていたのですが
# lynx 等に合わせました。
]PRE]

;; 
[CITE@en[Article 3610 at 03/01/06 22:41:52 From: hsaka@mth.biglobe.ne.jp Subject: [w3m-dev 03610] Re: news:<newsgroup>]] 
<http://www.sic.med.tohoku.ac.jp/~satodai/w3m-dev/200301.month/3610.html>

[6] [[RFC 1738]] によって標準化された後、実装との乖離が大きくなり、
また [[RFC 2396]] その他により [[RFC 1738]] が[[廃止]]されながらも改訂されず有効な仕様書が存在しない状態で長年放置されていましたが、
2010年にようやく [[RFC 5538]] が出版されました。

[35] [[RFC 5538]] は、 [[NNTP]] over [[TLS]] は[[非推奨]]であるとして、
[CODE(URI)@en[[[snews:]]]] を状態「[[歴史的]]」で[[IANA登録簿]]に登録しています。
構文は [CODE(URI)@en[[[news:]]]] と同じと述べています。 [SRC[>>5]]

* 例

[2] [CODE(URI)@en[[[news]]:*]]はすべての[[ニュース・グループ]]を表します。

**記事群を表す URI

-[8] nntp://[VAR[server.name]]:[VAR[port]]/[VAR[news.group]]
-[9] nntp://[VAR[server.name]]:[VAR[port]]/[VAR[news.group]]/[VAR[no1]]-[VAR[no2]] ;; 記事番号 [VAR[no1]]〜[VAR[no2]]。 [SAMP[2-]] のような書き方もある
-[13] nntp://[VAR[server.name]]:[VAR[port]]/ ;; サーバー

**記事を表す URI
-[12] nntp://[VAR[server.name]]/[VAR[msg-id]]
-[15] nntp://[VAR[server.name]]:[VAR[port]]/[VAR[msg-id]]
-[15] nntp://[VAR[server.name]]:[VAR[port]]/[VAR[no]] ;; 記事番号 [VAR[no]] の記事。 [SRC[[[RFC1738]]]]

[564] [CITE@en[news/nntp/snews - URL Programmer's Manual]]
( ([TIME[2014-12-05 11:27:05 +09:00]] 版))
<http://www.gnu.org/software/emacs/manual/html_node/url/news_002fnntp_002fsnews.html>

[565] [CITE@en[226890 – Thunderbird doesn't handle news: and nntp: URLs properly (RFC 5538)]]
( ([TIME[2014-12-05 11:29:59 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=226890>

[566] [CITE[URL Schemes Supported in Lynx]]
( ([TIME[2014-01-12 04:06:15 +09:00]] 版))
<http://lynx.isc.org/current/breakout/lynx_help/lynx_url_support.html#news_url>

[567] [CITE@en[Web Applications 1.0 r8872  Add openpgp4fpr: scheme to whitelist for registration]]
( ([TIME[2015-01-07 07:52:00 +09:00]] 版))
<https://html5.org/r/8872>

[568] [CITE@en[Web Applications 1.0 r8878  Put back nntp to the scheme whitelist, since it was removed completely accidentally.]]
( ([TIME[2015-01-09 03:40:00 +09:00]] 版))
<https://html5.org/r/8878>