ECMAScriptにおける空白文字
String.prototype.trim()
で何が除去されるのかを調査。
- 参考
※筆者のメモであるため、このスクラップ上の情報の正確性や解釈の厳密さは一切担保せず責任を負わない
-
22.1.3.30.1
のTrimString
にて解釈される - ちなみに
22
はText Processing - https://tc39.es/ecma262/#sec-trimstring
The definition of white space is the union of WhiteSpace and LineTerminator. When determining whether a Unicode code point is in Unicode general category “Space_Separator” (“Zs”), code unit sequences are interpreted as UTF-16 encoded code point sequences as specified in 6.1.4.
WhiteSpace
とLineTerminator
を確認すればよいみたい。
UTF-16 encoded code point sequences as specified in 6.1.4.
とあるので、Unicode general category “Space_Separator” (“Zs”) に分類される文字もそうらしい。
polyfillはこれ
if (!String.prototype.trim) {
String.prototype.trim = function () {
return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
};
}
どうやら/[\s\uFEFF\xA0]/
がWhiteSpace
, LineTerminator
, Space_Separator
を満たすらしい。
White Space
Code Point | Name | Abbreviation |
---|---|---|
U+0009 | CHARACTER TABULATION | <TAB> |
U+000B | LINE TABULATION | <VT> |
U+000C | FORM FEED (FF) | <FF> |
U+FEFF | ZERO WIDTH NO-BREAK SPACE | <ZWNBSP> |
Category “Zs” | Any Unicode “Space_Separator” code point | <USP> |
Line Terminators
Code Point | Unicode Name | Abbreviation |
---|---|---|
U+000A | LINE FEED (LF) | <LF> |
U+000D | CARRIAGE RETURN (CR) | <CR> |
U+2028 | LINE SEPARATOR | <LS> |
U+2029 | PARAGRAPH SEPARATOR | <PS> |
Category “Zs” がクセモノなのでこいつを深堀りする。
検索するとでるっちゃでるけど、これらは1次ソースではないため根拠が薄い
ECMAScriptとJava両方で空白として扱われるものはなにかを調べた。
Category | Java | ECMAScript | |||
---|---|---|---|---|---|
U+0009 | Character Tabulation, TAB | 水平タブ | Cc | 1 | 1 |
U+000A | End of Line, LF | 改行 | Cc | 1 | 1 |
U+000B | Line Tabulation, VT | 垂直タブ | Cc | 1 | 1 |
U+000C | Form Feed, FF | フォーム・フィード | Cc | 1 | 1 |
U+000D | Carriage Return, CR | 復帰 | Cc | 1 | 1 |
U+001C | File Separator | ファイル区切り文字 | Cc | 1 | 0 |
U+001D | Group Separator | グループ区切り文字 | Cc | 1 | 0 |
U+001E | Information Separator Two | レコード区切り文字 | Cc | 1 | 0 |
U+001F | Information Separator One | 単位区切り文字 | Cc | 1 | 0 |
U+0020 | Space | 半角スペース | Zs | 1 | 1 |
U+00A0 | No-Break Space, NBSP | Zs | 0 | 1 | |
U+1680 | Ogham Space Mark | Zs | 1 | 1 | |
U+2000 | En Quad | Zs | 1 | 1 | |
U+2001 | Em Quad | Zs | 1 | 1 | |
U+2002 | En Space | Zs | 1 | 1 | |
U+2003 | Em Space | Zs | 1 | 1 | |
U+2004 | Three-Per-Em Space | Zs | 1 | 1 | |
U+2005 | Four-Per-Em Space | Zs | 1 | 1 | |
U+2006 | Six-Per-Em Space | Zs | 1 | 1 | |
U+2007 | Figure Space | Zs | 0 | 1 | |
U+2008 | Punctuation Space | Zs | 1 | 1 | |
U+2009 | Thin Space | Zs | 1 | 1 | |
U+200A | Hair Space | Zs | 1 | 1 | |
U+202F | Narrow No-Break Space, NNBSP | Zs | 0 | 1 | |
U+205F | Medium Mathematical Space, MMSP | Zs | 1 | 1 | |
U+3000 | Ideographic Space | 全角スペース | Zs | 1 | 1 |
U+FEFF | Zero Width No-Break Space, BOM | Cf | 0 | 1 |
Javaは(全バージョンの改定を追ったわけではないが)Cc
カテゴリの区切り文字を空白として扱い、それはECMAScript上では空白として扱われないのが大きな違い。また、Javaでは改行なしの空白
についてはZs
カテゴリであったとしても空白として扱わない点も異なる。
ECMAScript処理系でJavaの空白を除去することを満たそうとすると、String.prototype.trim()
に加えてCc
に分類される4つの区切り文字を除去するようにすればとりあえず安心っぽい。おわり。
たまたま近いトピックを調査されていた@mugiさんからも記事が公開されました。併せてぜひ。