国際文字名とサロゲートペア

Hamigaki.Charsetのcode_page_test.cppで「L"\U00029E3D"」という国際文字名(Universal Character Name)を使っているんですが、これがsizeof(wchar_t)==2のVC++8/9やg++では「67 D8 3D DE 00 00」(リトルエンディアン)というバイト列になります。
(VC++7.1では上位16ビットが捨てられる模様)
ただし、規格上は

2.13.4/5
...
The size of a wide string literal is the total number of escape sequences, universal-character-names, and other characters, plus one for the terminating L’\0’.

ISO/IEC 14882/2003

となっていて、国際文字名一つが一文字でなければならないので、厳密には規格違反です。
この挙動はC++0xのchar16_tに相当するものになります。


とはいえ、「L"\uD867\uDE3D"」では国際文字名が不正なのでコンパイルエラーになります。
が、よく考えると「L"\xD867\xDE3D"」でよいですね、、、。
ワイド文字なら国際文字名を使うものだとばかり思い込んでいました。
まぁ、ワイド文字のエンコーディング処理系依存なので、決めうちするのもよくないですが。