2017-08-14 17 views
0

値対、私のような、\uXXXXエスケープシーケンスを使用してきた:16進数はうまく動作するはず使用して、しかしUnicodeエスケープシーケンス進は私のプログラムでのUnicode/UTF-8文字をエンコードするには

wchar_t superscript_4 = L'\u2074'; // U+2074 SUPERSCRIPT 4 '⁴' 
wchar_t subscript_4 = L'\u2084'; // U+2084 SUBSCRIPT 4 '₄' 

Unicodeは16進数でエンコードされているためです。

wchar_t superscript_4 = 0x2074; 
wchar_t subscript_4 = 0x2084; 

2番目の例では文字が正しくエンコードされますか?ワイド文字問題、セグメンテーションフォールト、誤って格納された文字値に遭遇しますか?もしそうなら、なぜですか?そうでない場合、なぜですか?

+0

最初の例では、私が知る限り、文字リテラルをCHAR_MAXより大きい値で定義しています。それ自体が悪いです... – rubenvb

+0

''\ u2074'の代わりに' L '\ u2074''を試しましたか? –

+0

@rubenvb whoops、typoがありました。固定(Keineのコメントごと)。 –

答えて

1

16進定数で初期化することもできますが、数字の定数で普通のcharを初期化することもできます。 char c = 67;。同じように動作します。 charまたはwchar_tの値がintのものを割り当てます。あなたが与えた例では、Unicode実行環境(保証はされていませんが、可能性は高いです)を仮定すると、それは添字または上付き文字4です。私の例ではそれは首都ですC

In particularは、定期的なchar秒間、'C'のような技術的に文字定数はタイプintを持っていて、通常char秒にint値を割り当てています。 wchar_tの場合、定数は実際にはwchar_tタイプであり、整数値はmbtowcを呼び出すと同じ値になります。したがって、Unicode環境で作業していると仮定すると、16進定数はUnicodeエスケープと同じです。

通常、これを行う必要はありません。文字リテラルを使用すると、あなたの意図がより明確になります。あなたは、コードだけの

wchar_t superscript_4 = L'⁴' 
wchar_t subscript_4 = L'₄' 

また、多くの目的のために、それはwchar_tができるので、char16_tまたはchar32_tを使用することをお勧めしますことに注意しても作ることができ、その場合、ソースコードに非ASCII文字を使用する場合、これは特にそうですプラットフォームによって幅が異なります。あなたが何か他のものに切り替える必要があるまでUTF-8を使うだけではなく、もっときれいになるかもしれません。

+0

したがって、16進定数でそれらを初期化する*同じことをしますか? (私はあなたの答えを読んで、私は2番目の文に同意します、私はちょうど興味があります) –

+2

@MDXF実行環境がUnicodeであると仮定します。理論的には、実行環境では、マルチバイト非Unicode文字セットを使用する可能性があります。この場合、Unicodeエスケープはまだ有効です(実行文字セットに正しい文字がある場合)。実際には実行環境はUnicodeになりますが、これは問題にはなりません。 –

関連する問題