[1] [DFN[[CODE(HTTP)@en[[[q]]]]]] [[引数]] ([DFN[[RUBYB[[[品質値]]]@en[quality value]]]]) は、
[[内容折衝]]等において選択肢の優先(希望)度を表す[[小数値]]です。

* 仕様書

[REFS[
- [17] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-06-07 01:55:45 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-5.3.1>
- [9] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-4.3>
- [6] [CITE@en[RFC 2295 - Transparent Content Negotiation in HTTP]] ([TIME[2014-08-31 19:36:42 +09:00]] 版) <http://tools.ietf.org/html/rfc2295#section-5>
]REFS]

* 定義と用語

[7] [[HTTP]] の最新仕様である [[RFC 7231]] では、[[小数値]]のことを[[品質値]]
([DFN[[[qvalue]]]])、それを値として持つ [CODE[[[q]]]] [[引数]]全体のことを「重み」
([DFN[[[weight]]]]) と呼んでいます。

[15] ただし、なぜか [CODE(HTTP)@en[[[TE:]]]] [[ヘッダー]]でだけは[[小数値]]のことを
「階数」 ([DFN[[[rank]]]])、 [CODE[[[q]]]] [[引数]]全体のことを [DFN[[[t-ranking]]]]
と呼んでいます。

;; [16] 呼称と定義は別々ですが、実質的に両者は同一です。

* 文脈

[11] [CODE(HTTP)@en[[[TE:]]]] [[ヘッダー]]の [CODE(HTTP)@en[[[q]]]]
[[引数]]は、[[転送符号化]]の名前と[[引数]]の後に1つだけ指定できます [SRC[>>9]]。

[18] [CODE(HTTP)@en[[[Accept:]]]] [[ヘッダー]]の [CODE(HTTP)[[[q]]]]
[[引数]]は、[[媒体範囲]]の後に1つだけ指定できます。 [CODE[[[q]]]]
[[引数]]の後の[[引数]]は、[[媒体範囲]]に属するものではなく、 [CODE(HTTP)@en[[[Accept:]]]]
の[[引数]]とみなされます。

[19] [CODE(HTTP)@en[[[Accept-Charset:]]]] [[ヘッダー]]の [CODE(HTTP)@en[[[q]]]]
[[引数]]は、[[文字コード]]範囲の後に1つだけ指定できます。

[20] [CODE(HTTP)@en[[[Accept-Encoding:]]]] [[ヘッダー]]の [CODE(HTTP)@en[[[q]]]]
[[引数]]は、[[内容符号化]]の名前の後に1つだけ指定できます。

[21] [CODE(HTTP)@en[[[Accept-Language:]]]] [[ヘッダー]]の [CODE(HTTP)@en[[[q]]]]
[[引数]]は、[[言語範囲]]の後に1つだけ指定できます。

[22] これらいずれの[[ヘッダー]]も、[[リスト]] ([CODE[#]]) であり、
複数の値を指定することができます。 [CODE[[[q]]]] は、
そのそれぞれの値に対する[[引数]]として記述できるものです。
[CODE(HTTP)@en[[[TE:]]]] と [CODE(HTTP)@en[[[Accept:]]]] では [CODE(HTTP)@en[[[q]]]]
より前に[[引数]]を指定することができ、それらは [CODE(HTTP)@en[[[q]]]]
[[引数]]の指定対象である値の一部分と解釈されます。
[CODE(HTTP)@en[[[Accept:]]]] では [CODE(HTTP)@en[[[q]]]]
[[引数]]より後に[[引数]]を指定することができ、それらは [CODE(HTTP)@en[[[q]]]]
[[引数]]と同様に値に関するオプションと解釈されます。
これら以外では、 [CODE(HTTP)@en[[[q]]]] 以外の[[引数]]は認められていません。

[40] 
[CODE[source-quality]]

* 構文

[10] [CODE[[[;]]]]、[CODE[q=]]、値の順に記述します。ただし
[CODE[[[;]]]] の前後には [[OWS]] を置けます。また [CODE[[[q]]]]
は大文字でも構いません。 [SRC[>>9, >>17]]

;; [13] [[転送符号化]]や [CODE(HTTP)@en[[[Accept:]]]] など他の [[HTTP]] 
の[[引数]]の構文とは違って、 [CODE[[[=]]]] の前後の [[BWS]] は認められていませんし、
値を[[引用文字列]]にすることも認められていません。

[12] 値は、0[[以上]]1[[以下]]の[[十進数]]を表す[[ASCII数字]]の列です。
ただし[[小数点]]は [CODE[[[.]]]] で表し、[[整数部]]は1桁、[[小数部]]は最大3桁とします。
[[整数]]のみや、[[整数]]と[[小数点]]のみの表記も認められています。 [SRC[>>9, >>17]]

[FIG(railroad)[
= [CODE[[[;]]]]
= |
== [CODE[[[q]]]]
== [CODE[[[Q]]]]
= [CODE[=]]
= |
== =
=== [CODE[0]]
=== ?
==== [CODE[.]]
==== *
===== [[数字]]
== =
=== [CODE[1]]
=== ?
==== [CODE[.]]
==== *
===== [CODE[0]]
]FIG]

[14] [[送信者]]は、受け入れられるものが複数ある時に、
[CODE(HTTP)[[[q]]]] [[引数]]によって優先度を指定することができます。
1 が最も好ましいことを表し、 0.001 が最も好ましくないことを表します [SRC[>>9, >>17]]。
0 は受け入れられないことを表します [SRC[>>9, >>17]]。 

* 零の値

[25] 値 0 は、その指定対象の値が受け入れられないオプションであることを表しています。

[26] ただし、それが意図通り解釈されるかどうかは不明瞭です。 [CODE(HTTP)[[[q]]]]
を無視するナイーブな実装では、逆に受け入れられるオプションの一つとして解釈されてしまいます。

* 既定値

[23] [CODE(HTTP)@en[[[q]]]] [[引数]]が指定されていない場合の[[既定値]]は、
1 です [SRC[>>17]]。

;; [24] なぜか [CODE(HTTP)@en[[[TE:]]]] については[[既定値]]の規定がありません。

* 同位の値

[27] 複数のオプションが指定されていて、それらの [CODE(HTTP)@en[[[q]]]]
が同値であるとき、どう解釈するべきなのかは不明です。

[28] [[電子メール]]の [CODE(822)@en[[[Accept-Language:]]]] [[ヘッダー]]では、
出現順を優先順位と考えるような言及があります。

* 原始品質

[29] [[異体説明]]で使われる[DFN[[RUBYB[[[原始品質]]]@en[source quality]]]] [SRC[>>28]] は 
[[HTTP]] 本体の[[q値]]に相当するものです。構文も意味も似ていますが、
[[要求]]で要求度を示すのではなく、[[応答]]で完全度を示すために使われます。

[31] [[原始品質]]は、当該[[異体]]に関する[[折衝可能資源]]の[[表現]]としての[[品質]]を表します。
これは当該[[異体]]を可能な最高の出力媒体に完璧な[[レンダリングエンジン]]で[[レンダリング]]した時の値です。[[言語]]の翻訳や[[MIME型]]の表現能力の品質も表します。 [SRC[>>28]]

[32] 構文としては [CODE(HTTP)@en[[[q]]]] [[引数]]の値と同じものを採用しています [SRC[>>28]]。
[CODE[q=]] は含みません。

[33] 1[[未満]]の値は、有損失変換による劣化の度合いを表します [SRC[>>28]]。

[EG[
[34] [[JPEG]] の[[写真]]を [[XBM]] に変換すると値は小さくなりますし、
[[ASCIIアート]]にすると更に小さくなります。 [SRC[>>28]]
]EG]

[EG[
[35] 逆に[[ASCIIアート]]が原典なら、それを撮影して [[JPEG]] にすると値は小さくなります [SRC[>>28]]。
]EG]

[30] 次のように値の目安が定められています [SRC[>>28]]。
>
      1.000  perfect representation
      0.900  threshold of noticeable loss of quality
      0.800  noticeable, but acceptable quality reduction
      0.500  barely acceptable quality
      0.300  severely degraded quality
      0.000  completely degraded quality

;; [36] この目安は[[局所異体選択アルゴリズム]]においてレンダリング方法の品質を表現するためにも使えます [SRC[>>28]]。

* 文脈

[37] [CODE(HTTP)@en[[[q]]]] [[引数]]は次の[[ヘッダー]]に存在します。
[FIG(short list)[
- [CODE(HTTP)@en[[[Accept:]]]]
- [CODE(HTTP)@en[[[Accept-Charset:]]]]
- [CODE(HTTP)@en[[[Accept-Encoding:]]]]
- [CODE(HTTP)@en[[[Accept-Language:]]]]
- [CODE(HTTP)@en[[[TE:]]]]
- [CODE(HTTP)@en[[[A-IM:]]]]
- [CODE(HTTP)@en[[[Want-Digest:]]]]
- [CODE(HTTP)@en[[[Accept-Additions:]]]]
]FIG]

;; [38] [CODE(HTTP)@en[[[Accept-Features:]]]] にはありません。

[39] [[品質値]]はその他に[[異体説明]]でも使われます。つまり
[CODE(HTTP)@en[[[Alternates:]]]] [[ヘッダー]]内に現れることがあります。

* 歴史

[FIG(quote)[
[FIGCAPTION[
[8] RFC 2068・2616 (HTTP/1.1) 3.9 Quality Values
]FIGCAPTION]

> HTTP content negotiation (section 12) uses short "floating point"
numbers to indicate the relative importance ("weight") of various
negotiable parameters.  A weight is normalized to a real number in the
range 0 through 1, where 0 is the minimum and 1 the maximum value. [INS[If a parameter has a quality value of 0, then content with this parameter is `not acceptable' for the client.]]
HTTP/1.1 applications MUST NOT generate more than three digits after
the decimal point. User configuration of these values SHOULD also be
limited in this fashion.

[2] [[HTTP]] 内容折衝は、
各折衝可能引数の相対重要度 (「重み」) を示すために短い「[[浮動小数点]]」
数値を使います。重みは [CODE(conneg)[0]] から [CODE(conneg)[1]]
の範囲の[[実数]]に[[正規化]]します。 [CODE(conneg)[0]] が最小値で、
[CODE(conneg)[1]] が最大値です。 [INS[引数の質値が [CODE(conneg)[0]] の場合、その引数が添えられた内容を[[クライアント]]は「受入れ不能」です。]]
HTTP/1.1 応用は、小数点以下に3桁より多くの数字を生成しては'''なりません'''。
この値の利用者設定もこの様式に制限する'''べきです'''。

>
- [3] [CODE(ABNF)[qvalue         = ( "0" [ "." 0*3DIGIT ] ) | ( "1" [ "." 0*3("0") ] )]]

> "Quality values" is a misnomer, since these values merely represent
relative degradation in desired quality.

[4] 「質値」という名前は誤りです。この値は単に望まれる質の相対的な格を表現するに過ぎないからです。
]FIG]

* メモ

- [1] [[Java]] では [CODE(HTTP)[*/*; q=.2]] みたいな値を使うらしいですが、これは誤りです。

[5]
>>1 のような値を紹介している解説もしばしば見かけます。。。
([[名無しさん]] [WEAK[2006-12-25 10:44:40 +00:00]])