2011-10-03 23 views
12

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

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

しかし、私は同様にwchar_t文字列リテラルのUnicodeエスケープシーケンスを使用できますか?これが不可能ならば、それは欠陥であるように思えます。

const wchar_t* sw = L"\u00DA"; 

特定のプラットフォーム上にあるものwchar_t上、他のすべての効果に依存sw[0]の整数値は、もちろん、これはありません、ポータブルであるべきでしょうか?

+0

Iは、SW 'の値は[0] '' wchar_t'のみの程度に特定のプラットフォーム上にあるかに依存信じます'wchar_t'のサイズは何ですか。私。 '\ u00DA'は、U + 00DAのUnicodeエンコーディング(UTF-8、UTF-16、UTF-32)になるはずです。 – bames53

+1

実際は上記は間違っています。実装は、普遍的な文字名をリテラル文字と同様に扱うことになっています。したがって、インプリメンテーションが文字列リテラルの文字を実行文字セットに変換する場合は、UCNも同様に実行する必要があります。 UCNがUnicodeリテラル(たとえば、u8 "\ u00DA")内にある場合、UTFエンコーディングが保証されます。 – bames53

答えて

8

これは機能しますが、目的のセマンティクスがない可能性があります。 \u00DAは、wchar_tのサイズに応じて、UTF8/16/32エンコーディングに必要なだけ多くのターゲット文字に拡張されますが、ワイド文字列には、保証されたエンコーディングセマンティクスが記載されていないことに注意してください。それが何であるかを言うことを試みることなく、またはユーザに要求するはそれが何であるかをエンコードします。

だから、それは混同しないようにしてください。 2つのうち、いずれか一方ではなく、両方を使用します。

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

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

(ここでは、鉱山のsomerelatedquestionsは、被験者にある。)

+0

この質問の背景については、[このlibC++テスト](http://llvm.org/svn/llvm-project/libcxx/trunk/test/localization/locale.categories/category.ctype/locale)を参照してください。 .ctype.byname/is_1.pass.cpp)がWindowsで '\ x00DA'行に失敗しています。私はこれを '\ u00DA'に置き換えて十分な大きさのすべての' wchar_t'(16または32ビット)に対して動作させることができるのだろうかと思います。 – rubenvb

関連する問題