13

C++11 では、新しい文字列リテラル プレフィックスのセットが導入されています (さらに、ユーザー定義のサフィックスも使用できます)。さらに、Unicode エスケープ シーケンスを直接使用して、エンコーディングを気にせずに特定のシンボルをコーディングできます。

const char16_t* s16 = u"\u00DA";
const char32_t* s32 = U"\u00DA";

wchar_tしかし、文字列リテラルでもUnicode エスケープ シーケンスを使用できますか? これができないとしたら、それは欠陥のように思われます。

const wchar_t* sw = L"\u00DA";

の整数値はsw[0]もちろん、特定のプラットフォームにあるものに依存しwchar_tますが、他のすべての効果に対して、これは移植可能であるはずですよね?

4

1 に答える 1

10

それは機能しますが、必要なセマンティクスを持たない可能性があります。\u00DAのサイズに応じて、UTF8/16/32 エンコーディングに必要な数のターゲット文字に展開されますがwchar_t、ワイド文字列には文書化され保証されたエンコーディング セマンティクスがないことに注意してください。それらは単に「システムのエンコーディング」です。 、それが何であるかを言おうとしたり、ユーザーにそれが何であるかを知るように要求したりすることはありません。

なので、混ぜない方がいいです。次の 2 つのいずれかを使用します。両方を使用することはできません。

  1. システム固有: char*/ "", wchar_t*/ L"", \x-literals, mbstowcs/wcstombs

  2. Unicode: char*/ u8""char16_t*/ u""char32_t*/ U""\u/\Uリテラル。

(これは この件に関する私の関連する 質問です。)

于 2011-10-03T15:06:10.880 に答える