[69] [DFN[[RUBYB[スカラー値列]@en[scalar value string]]]] ([DFN[[CODE[USVString]]]])
は、[[Unicodeスカラー値]]の[[文字列]]です。

[70] ほとんど「[[Unicode文字列]]」という意味に近いですが、
「[[文字]]」の語義を巡っては相当の混乱があります。

* 仕様書

[REFS[
- [25] '''[CITE[Web IDL (Second Edition)]] ([TIME[2016-05-21 05:55:04 +09:00]]) <https://heycam.github.io/webidl/#idl-USVString>'''
- [26] [CITE[Web IDL (Second Edition)]] ([TIME[2016-05-21 05:55:04 +09:00]]) <https://heycam.github.io/webidl/#es-USVString>
- [38] [CITE[Web IDL (Second Edition)]] ([TIME[2016-05-21 05:55:04 +09:00]]) <https://heycam.github.io/webidl/#dfn-obtain-unicode>
]REFS]

* 意味

[27] [CODE(IDL)@en[USVString]] は、[[Unicodeスカラー値]]の[[列]]を表します [SRC[>>25]]。

[29] [[型名]]は、 [CODE[USVString]] です [SRC[>>25]]。

* 構文

[28] [[辞書メンバー]]や[[引数]]の[[既定値]]の指定では、
[[文字列リテラル]]として記述できます [SRC[>>25]]。

* 文脈

[30] ほとんどの場合は [CODE(IDL)@en[DOMString]] を使うべきであり、
[[Unicodeスカラー値]]の列が必要な場合に限って [CODE(IDL)@en[USVString]]
とする[SHOULD[べき]]です [SRC[>>25]]。

[60] 次の場面で使われています。
[FIG(short list)[
- [[URL]] の一部または全部を入出力とするもの
- [[起源]]を入出力とするもの
- [CODE(JS)@en[document.domain]]
- [CODE(JS)@en[document.cookies]]
- [CODE(DOMi)@en[FormData]] [[API]]
- [[Fetch]] [[API]]
- [CODE(DOMi)@en[WebSocket]] [[API]]
- [CODE(DOMi)@en[TextDecoder]]
- [[フォームデータ集合]]
]FIG]

[HISTORY[
[61] [[ネットワーク]]の入出力 (に伴い[[文字コード]]の変換が発生するもの) だけでなく、
[[URL]] でも [CODE(DOMi)@en[USVString]] が使われています。利用箇所数でいえば
[CODE(DOMi)@en[USVString]] のほとんどは [[URL文字列]]です。
[[JavaScript]] や [[DOM]] が[[符号単位]]列 ([CODE(IDL)@en[DOMString]])
ベースである以上 [[URL]] に[[サロゲート]]が混入する可能性は排除できないのですが、
[[Ian Hickson]] は [[URL]] の[[構文解析器]]で行うべきと主張したのに対し、
[[Anne]] は [[URL]] の[[構文解析器]]の入出力は[[Unicodeスカラー値]]列だと定め、
[[URL]] を使うあらゆる [[API]] の[[データ型]]を [CODE(IDL)@en[USVString]]
に書き換えていきました。 (つまり [[URL]] の[[構文解析器]]の入力時ではなく、
[[メソッド]]の呼び出しや [[IDL属性]]の[[設定器]]の呼び出しの時点で[[サロゲート]]の検査を行うこととしました。)

[62] [[内容属性]]を[[反映]]する [CODE(IDL)@en[USVString]] の [[IDL属性]]経由で[[属性値]]を設定すると[[サロゲート]]の検査が行われ、
[CODE(DOMm)@en[setAttribute]] などを使うと検査が行われません。
[[サロゲート]]がそのまま [[URL Standard]] の[[構文解析器]]に渡るとすると[[素片識別子]]部分ならそのまま、
それ以外なら [[UTF-8パーセント符号化]]されるはずで、前者の場合[[サロゲート]]のまま出力されるはずですが、
[[Chrome]] では [CODE(char)[U+FFFD]] に置き換わっています。 ([[Firefox]] では[[素片識別子]]全体が[[UTF-8パーセント符号化]]されるので、そもそも [[URL Standard]]
と動作が違います。)
[[WebIDL]] レベルで変換しても、結局 [[URL]]
の[[構文解析器]]に渡す直前またはその中でまた検査するのが現実の実装ということになるので、
[[WebIDL]] レベルでの変換が本当に必要だったのかに疑問が生じます。
]HISTORY]

* 変換

[31] [CODE(IDL)@en[USVString]] 型の[[IDL値]][VAR[入力]]から [[JavaScript]] 
への[[変換][変換 (WebIDL)]]は、次のようにします [SRC[>>26]]。
[FIG(steps)[
= [35] [VAR[スカラー値列]]を、[VAR[入力]]の表す[[Unicodeスカラー値]]の列に設定します。
= [36] [VAR[符号単位列]]を、[VAR[スカラー値列]]を [[UTF-16]] で[[符号化]]した結果の[[符号単位]]の列に設定します。
= [37] [VAR[符号単位列]]と同じ[[符号単位]]の列を表す [CODE(JS)@en[String]]
値を返します。
]FIG]

[33] [[JavaScript]] [VAR[入力]]から [CODE(IDL)@en[USVString]]
型[[IDL値]]への[[変換][変換 (WebIDL)]]は、次のようにします [SRC[>>26]]。
[FIG(steps)[
= [32] [VAR[列]]を、[VAR[入力]]を [CODE(IDL)@en[DOMString]] に[[変換][変換 (WebIDL)]]した結果に設定します。
= [34] [VAR[列]]を[[[CODE(IDL)@en[DOMString]]をUnicodeスカラー値列に変換]]した結果を返します。
]FIG]

[39] [VAR[符号単位列]]について[DFN[[RUBYB[[[[CODE(JS)@en[DOMString]]をUnicodeスカラー値列に変換]]]@en[convert a DOMString to a sequence of Unicode scalar values]]]]するには、
次のようにします [SRC[>>38]]。
[FIG(steps)[
= [42] [VAR[スカラー値列]]を、[[空]]の[[列]]に設定します。
= [40] [VAR[n]] を、[VAR[文字列]]の[[長さ]]に設定します。
= [41] [VAR[i]] を、 [N[0]] に設定します。
= [43] [VAR[i]] < [VAR[n]] の間、繰り返し、
== [44] [VAR[c]] を、[VAR[符号単位列]]において[[索引]] [VAR[i]] の[[符号単位]]に設定します。
== [45] [VAR[c]] により、
[FIG(switch)[
: [VAR[c]] が[[範囲]] [ [N[0xDC00]], [N[0xDFFF]] ] に含まれる :
[VAR[スカラー値列]]の末尾に [CODE(char)[U+FFFD]] を追加します。
: [VAR[c]] が[[範囲]] [ [N[0xD800]], [N[0xDBFF]] ] に含まれる :
[FIG(steps)[
= [46] [VAR[i]] が [VAR[n]] - 1 なら、
== [47] [VAR[スカラー値列]]の末尾に [CODE(char)[U+FFFD]] を追加します。
= [48] それ以外なら、
== [49] [VAR[d]] を、[VAR[符号単位列]]において[[索引]] [VAR[i]] + 1 の[[符号単位]]に設定します。
== [50] [VAR[d]] が[[範囲]] [ [N[0xDC00]], [N[0xDFFF]] ] に含まれるなら、
=== [51] [VAR[スカラー値列]]の末尾に[[符号位置]] [N[216]] + [N[210]] × ([VAR[c]] & [N[0x3FF]]) + 
([VAR[d]] & [N[0x3FF]]) の[[Unicode文字]]を追加します。
=== [52] [VAR[i]] を[[インクリメント]]します。
== [53] それ以外なら、
=== [54] [VAR[スカラー値列]] の末尾に [CODE(char)[U+FFFD]] を追加します。
]FIG]
: それ以外 :
[VAR[スカラー値列]]の末尾に[[符号位置]] [VAR[c]] の[[Unicode文字]]を追加します。
]FIG]
== [55] [VAR[i]] を[[インクリメント]]します。
= [56] [VAR[スカラー値列]]を返します。
]FIG]

;; [57] これはつまり、[[サロゲートペア]]になっていない[[サロゲート]]が含まれる時、
[CODE(char)[U+FFFD]] に置換されることとなります。

[73] 次の場面で使われます。

[FIG(short list)[ [74] [DFN[Unicodeに変換]]する場面
- [CODE[send][send (XHR)]]
]FIG]

* 歴史

** [CODE(IDL)@en[EnsureUTF16]]

@@ XXX

** [CODE(IDL)@en[ScalarValueString]]

[REFS[
- [2] [CITE@en[Bug 24581 – Fix ByteString type & ''''''[''''''EnsureUTF16'''''']'''''' flag story]]
( ([TIME[2014-05-21 03:17:32 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=24581>
- [1] [CITE[Add ScalarValueString · 1866106 · whatwg/encoding]]
( ([TIME[2014-05-21 03:16:51 +09:00]] 版))
<https://github.com/whatwg/encoding/commit/18661066238357d6f2da5b8ca59b4055f00fad3d>
- [3] [CITE[Use ScalarValueString https://www.w3.org/Bugs/Public/show_bug.cgi?id=255... · fad6118 · whatwg/xhr]]
( ([TIME[2014-05-21 03:20:58 +09:00]] 版))
<https://github.com/whatwg/xhr/commit/fad6118b670569bef63afc8d5e1bb5a94154f431>
- [4] [CITE[Use ScalarValueString · 88155a5 · whatwg/url]]
( ([TIME[2014-05-21 03:22:16 +09:00]] 版))
<https://github.com/whatwg/url/commit/88155a5f136b702ef977fdc601629f0564cbdde3>
- [5] [CITE[The Oprah meme for ScalarValueString · f79a4b5 · whatwg/url]]
( ([TIME[2014-05-28 15:30:35 +09:00]] 版))
<https://github.com/whatwg/url/commit/f79a4b5a0eef68ee587a87820c06fcf83a0674b9>
- [6] [CITE[Clarify URL use in APIs · eece8eb · whatwg/url]]
( ([TIME[2014-05-28 15:31:31 +09:00]] 版))
<https://github.com/whatwg/url/commit/eece8ebf1391c538cdbaab6e4b957ea769d06b56>
]REFS]

** [CODE(IDL)@en[USVString]]

[12] [CODE(IDL)@en[[[EnsureUTF16]]]] は >>11 で削除されました。

[14] >>13 で [CODE(IDL)@en[[[USVString]]]] が追加されました。

[REFS[
- [13] [CITE@en[Add USVString and allow string literals in IDL to be used to give values... · 672e73d · heycam/webidl]] ([TIME[2014-10-10 07:30:10 +09:00]] 版) <https://github.com/heycam/webidl/commit/672e73d476d8c4341339cc22592bb5ff01c69823>
- [11] [CITE@en[Remove '''['''EnsureUTF16''']'''. · e2cf800 · heycam/webidl]] ([TIME[2014-10-10 07:21:43 +09:00]] 版) <https://github.com/heycam/webidl/commit/e2cf800ef401578db8d1445d815dc13bc8899554>
- [7] [CITE@en[IDL now defines USVString (new ScalarValueString) · 193297f · whatwg/encoding]] ([TIME[2014-10-04 12:42:24 +09:00]] 版) <https://github.com/whatwg/encoding/commit/193297f512d34bb952c4473f95324939dd2cc0d6>
- [8] [CITE@en[IDL defines ScalarValueString as USVString now · 0f14352 · whatwg/fetch]] ([TIME[2014-10-04 12:43:09 +09:00]] 版) <https://github.com/whatwg/fetch/commit/0f143525dfb28c57e6b776eb3d26610be44b97e6>
- [9] [CITE@en[ScalarValueString -> USVString · b75e040 · whatwg/url]] ([TIME[2014-10-04 12:43:29 +09:00]] 版) <https://github.com/whatwg/url/commit/b75e040ed46a7bee5f383e501fd6257c46b2753a>
- [10] [CITE@en[Align with IDL and DOM changes · fb55469 · whatwg/xhr]] ([TIME[2014-10-04 12:44:40 +09:00]] 版) <https://github.com/whatwg/xhr/commit/fb55469f56253d6d40e2430314d63c720c5b19bd>
]REFS]

[15] [CITE@en[Web Applications 1.0 r8836 Switch to using USVString where that makes the prose simpler. (WebSocket, primarily)]]
( ([TIME[2014-10-11 09:58:00 +09:00]] 版))
<https://html5.org/r/8836>

[16] [CITE@en[Since icon takes a URL -> USVString · f62c920 · whatwg/notifications]]
( ([TIME[2014-11-13 11:30:44 +09:00]] 版))
<https://github.com/whatwg/notifications/commit/f62c920ad1bca50d40ccc3e9a9a6ffef234ae5bc>

[17] [CITE@en[Allow USVString to be serialized. · heycam/webidl@d7aaded]]
([TIME[2015-04-19 13:09:02 +09:00]] 版)
<https://github.com/heycam/webidl/commit/d7aaded036ea48a4d9a8fd543d2cba046ce34cab>

[18] [CITE@en[USVString is the right type for things to be encoded and sent over th… · w3c/webappsec-credential-management@c749164]]
([TIME[2015-11-19 16:26:11 +09:00]] 版)
<https://github.com/w3c/webappsec-credential-management/commit/c7491649ac0ae7d30f00e31c70f5c7194cc9f48b>

[19] [CITE@en[Editorial: define Event attribute defaults through IDL · whatwg/html@0be0229]]
([TIME[2016-03-23 21:16:59 +09:00]] 版)
<https://github.com/whatwg/html/commit/0be02299f128cbb7c65a7ce259fdd838fd44a4b5>

[20] [CITE@en[Use USVString for oldURL, newURL, and origin attributes on events · whatwg/html@5d5702d]]
([TIME[2016-03-23 21:19:46 +09:00]] 版)
<https://github.com/whatwg/html/commit/5d5702d35a0b7457481d1013154f14aab25500bf>

[21] [CITE@en[Update WebSocket to use Fetch's WebSocket alterations · whatwg/html@3dadbca]]
([TIME[2016-03-28 22:54:41 +09:00]] 版)
<https://github.com/whatwg/html/commit/3dadbcad063a10b586ef52dd4b427aa339048ee7>

[22] [CITE@en[Use USVString for document.domain/referrer/cookie · whatwg/html@8170d82]]
([TIME[2016-04-05 13:59:49 +09:00]] 版)
<https://github.com/whatwg/html/commit/8170d82a2fc93c8ff7981c54aa4ccafd54204552>

[23] [CITE@en[Make EventSource use the base URL of its global · whatwg/html@3175b53]]
([TIME[2016-04-22 18:23:10 +09:00]] 版)
<https://github.com/whatwg/html/commit/3175b53a7fab83a62fc1c5674e8356f720d2aa4a>

[24] [CITE@en[Reflect USVString IDL attributes for URLs as well as DOMString ones · whatwg/html@2ced624]]
([TIME[2016-04-23 16:30:11 +09:00]] 版)
<https://github.com/whatwg/html/commit/2ced6248d16e5a742e324ba3f506cc6d179b0414>

[58] [[Firefox]] も [[Chrome]] も、 [CODE(HTML)@en[<a href>]] の
[[IDL属性]]で既に [CODE(IDL)@en[USVString]] として動作するようになっているようです。
[[IE9]] は [CODE(IDL)@en[DOMString]] としているようです。
[TIME[2016-05-21T15:17:18.500Z]]

[59] [[Firefox]] も [[Chrome]] も [CODE(HTML)@en[<blockquote cite>]]
は [CODE(IDL)@en[USVString]] ではなく [CODE(IDL)@en[DOMString]] 
としています。
[TIME[2016-05-21T15:20:16.800Z]]

[63] [CITE@en[Use USVString for URLs and origins in IDL]]
( ([[zcorpan]]著, [TIME[2016-05-20 21:56:11 +09:00]]))
<https://github.com/whatwg/dom/commit/1bb85a48e07d1000e00bd792d61247b9a5e2e4ae>

[64] [CITE@en[Use USVString for all URLs]]
( ([[domenic]]著, [TIME[2016-05-20 22:02:29 +09:00]]))
<https://github.com/whatwg/html/commit/018b983b77b2cd908f6d00100e7e0abe893dd2c3>

[65] [CITE@en[Ensure strings in the form data set contain USVs]]
([[yuyokk]]著, [TIME[2016-12-17 05:26:43 +09:00]])
<https://github.com/whatwg/html/commit/f35af4efea8f89743ebdda4661c3bb58349828a9>

[66] [CITE@en[Use USVString rather than '''['''EnsureUTF16''']''' for fileName.]]
([[mkruisselbrink]]著, [TIME[2017-02-04 07:25:23 +09:00]])
<https://github.com/w3c/FileAPI/commit/abf6637473a9c81247fce46ef0a2954be95908f1>

[67] [CITE@en[Define JavaScript string and scalar value string]]
([[annevk]]著, [TIME[2017-03-27 16:01:49 +09:00]])
<https://github.com/whatwg/infra/commit/f1be763cfba23d2fc780b35403074c599e69616e>

[68] [CITE@en[Define length for byte sequences and strings]]
([[annevk]]著, [TIME[2017-03-27 16:59:15 +09:00]])
<https://github.com/whatwg/infra/commit/c484a4fe0d7bdc52b0f17ab99e49eaa9e56e3f56>

[71] [CITE@en['''['''cssom''']''' Use USVString for href attribute of Stylesheet and CSSImportRule]]
([[SimonSapin]]著, [TIME[2017-04-21 12:19:25 +09:00]])
<https://github.com/w3c/csswg-drafts/commit/4ade7360db96f95c902e9c8b24dd6e4e20d49ec7>

[72] [CITE@en[IDL amendments and small misc issues. (#271)]]
([[andypaicu]]著, [TIME[2017-12-13 17:46:06 +09:00]])
<https://github.com/w3c/webappsec-csp/commit/82aebd3dcd00492ce718e92ada3ebf1e4133cf36>

[75] [CITE@en[Editorial: rewrite send()'s body/content-type processing]]
([[domenic]]著, [TIME[2018-04-24 00:09:11 +09:00]])
<https://github.com/whatwg/xhr/commit/f47bbab42dabe1f52e5e9f1ed1fa6df06a6eb310>

[76] [CITE@en['''['''typed-om''']''' Per WG resolution, just use USVString for everything. Fixes …]]
([[tabatkins]]著, [TIME[2018-02-22 06:51:54 +09:00]])
<https://github.com/w3c/css-houdini-drafts/commit/5e48fe4bcf68c81c2da464fa8f1b8fd0595d3428>

[77] [CITE@en[Should we be using DOMString, USVString, or CSSOMString? · Issue #687 · w3c/css-houdini-drafts]]
([TIME[2018-05-08 21:37:46 +09:00]])
<https://github.com/w3c/css-houdini-drafts/issues/687>

[78] [CITE@en[SecurityPolicyViolationEvent needs more USVString · Issue #266 · w3c/webappsec-csp]]
([TIME[2019-03-08 12:22:53 +09:00]])
<https://github.com/w3c/webappsec-csp/issues/266>