U

\u エスケープ

[19] Unicode符号位置\uHHHH のようにエスケープする方法が色々な場面で使われます。

BMP 符号位置の符号化

[20] U+0000-U+FFFF符号位置は、 \u の後に4桁のASCII十六進数字符号位置を表すことによって表現できます。

[22] 十六進数字として大文字小文字のどちらを用いるか (両方認められるか) は、使われる文脈によります。

[21] 何をエスケープ形で表し、何をエスケープしないで表すかは、 使われる文脈によります。

非 BMP 符号位置の符号化

[23] U+10000 以上符号位置の表現方法は、 いくつかの流儀があります。

[24] 古くから使われている方法では、 \U の後に8桁の十六進数字符号位置を指定します。 この方法は UCS の31ビットすべての符号位置を表現できます。 (BMP をこの方法でも表現できるかどうかは、文脈によります。)

[25] 場合によっては、 \U の後に6桁の十六進数字符号位置を指定します。 この方法は Unicode の21ビットすべての符号位置を表現できます。 (BMP をこの方法でも表現できるかどうかは、文脈によります。)

[26] この2つの方法は、混在させることができません。

[27] UTF-16 を使う環境では、サロゲートペアに相当する2つの符号位置\uHHHH 形で非 BMP 符号位置を表現する場合があります。

エラー処理

[28] エラー処理の方法は、文脈によります。困ったことに、明確に規定していない場合もあります。

[29] 少なくても次のようなエラー状況を想定する必要があります。

十六進記法 (Unicode 正規表現)

[37] Unicode正規表現においては、 (じゅう) (ろく) (しん) () (ほう) (Hex Notation) の実装が要求されています。 >>36

[38] 十六進記法は、 16進数表現によって任意のUnicode符号点 [ U+0000, U+10FFFF ] を指定できなければなりません。 >>36 RL1.1

[48] サロゲート符号点非文字も含まれています。

[39] 特定の構文の実装までは要求されておらず、既存の正規表現構文の自然な拡張が想定されているようです。 しかしながら、 符号点16進数で表したものでなくてはならず、 UTF-8 バイト列UTF-16符号単位16進数表現ではこの要件を満たせません >>36

[40] U+1D11E\U0001D11E, \x{1D11E}, \u{1D11E} のように表せます。 >>36

[41] 記法例として、次のような構文が定められています。 >>36

\uHHHH (Java)

[1] Java の \u 符号化 (UnicodeEscape) http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html#100850 http://java.sun.com/docs/books/jls/first_edition/html/3.doc.html#100850 http://www.y-adagio.com/public/standards/tr_javalang2/lexical.doc.html http://www.y-adagio.com/public/standards/tr_javalang/3.doc.htm

[2] >>1ABNF に翻訳すると、

[4] Mozilla でも使われていて、 x-u-escaped と呼ばれている。

[5] U+10000 〜 をどう表現するのかは不明。

[10] >>5-9 Java では \UHHHHHH とするようです。

Supplementary Characters in the Java Platform http://java.sun.com/developer/technicalArticles/Intl/Supplementary/

\uHHHH (JavaScript)

[11] JavaScript正規表現で \u の後に十六進数が4桁続かない場合、 ES3 によると構文エラーのはずですが、どのブラウザでも、 \ がなかった場合と同じように処理されます。

\u'HHHH' (RFC 5137)

[12] RFC 5137 (BCP 137) は、 Unicode 文字escape するための方法で勧められるものを2つ挙げています。 そのうちの1つが ¥u'HHHH' のような書式です。

   EmbeddedUnicodeChar =  %x5C.75.27 4*6HEXDIG %x27
      ; starting with lowercase "\u" and "'" and ending with "'".
      ; Note that the encodings are considered to be abstractions
      ; for the relevant characters, not designations of specific
      ; octets.
   HEXDIG =  "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" /
      "A" / "B" / "C" / "D" / "E" / "F"

RFC 5234のABNF を用いているので、十六進数大文字小文字は区別しません。 (「\u」の部分は小文字でなければなりません。)

[13] RFC 5137 はこの他 XML十六進数文字参照も勧めています。 C 式の「\uHHHH」/「\UHHHHHHHH」表記、 Perl 風の「¥x{H}」表記、 Java 式の「\uHHHH」+ 代理組表記は「通常は勧められない」としています。 (C 式が勧められないのは、終わりを表す区切子がないため。)

[14] RFC 5137 - ASCII Escaping of Unicode Characters ( 版) https://tools.ietf.org/html/rfc5137#section-5.1

[15] draft-klensin-encoded-word-type-u-00 - The "U" Encoding for Encoded-Words in Email ( 版) https://tools.ietf.org/html/draft-klensin-encoded-word-type-u-00

[16] この方法が IETF 以外で使われるのは見たことがありません。 IETF は世間一般で広く普及した形式を奇妙にアレンジするのが好きなようです。

Universal character name

[49] 本の虫: C++0xにおけるユニバーサルキャラクタ名(universal character name)について, , https://cpplover.blogspot.com/2008/12/c0xuniversal-character-name.html

[50] Universal Character Name – EmEditor (テキストエディタ), https://jp.emeditor.com/text-editor-features/more-features/universal-character-name/

[51] D.1.4 Universal Character Names (UCN) (Sun Studio 12 Update 1: C User's Guide), https://docs.oracle.com/cd/E19205-01/820-7598/bjazf/index.html

[52] String and character literals (C++) | Microsoft Learn, TylerMSFT, https://learn.microsoft.com/en-us/cpp/cpp/string-and-character-literals-cpp?view=msvc-170#bkmk_UCN

関連

[17] U+%u も参照。

[34] \x も参照。

メモ

[18] Unicode の文字列をソースコードに埋め込む方法 - いやなブログ (2007-09-09 19:34:15 +09:00 版) http://0xcc.net/blog/archives/000183.html

[35] rfc3862, https://datatracker.ietf.org/doc/html/rfc3862#section-2.3