0

C ++標準ライブラリのほとんどのテキストでは、charではなくwchar_tでパラメータ化されていることを除いて、wstringはstringと同等であると記載されており、文字列のみのデモンストレーションに進みます。

まあ、時々、いくつかの特定の癖があります、そしてここに1つあります:私は16ビット文字のNULLで終了する配列からwstringを割り当てることができないようです。問題は、割り当てがヌル文字とそれに続くゴミを実際の文字としてうまく使用することです。これは非常に小さな削減​​です:

typedef unsigned short PA_Unichar;
PA_Unichar arr[256];
fill(arr); // sets to 52 00 4b 00 44 00 61 00 74 00 61 00 00 00 7a 00 7a 00 7a 00
// now arr contains "RKData\0zzz" in its 10 first values
wstring ws;
ws.assign((const wchar_t *)arr);
int l = ws.length();

この時点で、lは予想される6( "RKData"の文字数)ではありませんが、はるかに大きくなっています。私のテストランでは29です。なぜ29なのですか?わからない。メモリダンプには、29番目の文字の特定の値は表示されません。

だから質問:これは私の標準C ++ライブラリ(Mac OS X Snow Leopard)のバグですか、それとも私のコードのバグですか?16ビット文字のnullで終了する配列をwstringに割り当てるにはどうすればよいですか?

ありがとう

4

3 に答える 3

9

ほとんどのUnix(Mac OS Xも同様)では、whar_tUTF-32シングルコードポイントを表し、Windowsのような16ビットutf-16ポイントではありません。

したがって、次のことを行う必要があります。

  1. また:

    ws.assing(arr,arr + length_of_string);
    

    これは、イテレータとしてarrを使用し、各短いintをwchar_tにコピーします。ただし、これは、文字がBMPにあるか、UCS-2(16ビットレガシーエンコーディング)を表す場合にのみ機能します。

  2. または、 utf-16を正しく操作します。utf-16をutf-32に変換します。代理ペアを見つけて、それらを単一のコードポイントにマージする必要があります。

于 2009-08-27T11:58:25.243 に答える
3

早くやれよ。コードに含まれていませんでした。符号なしショートの配列をwstringに割り当て、キャストを使用してコンパイラをシャットダウンしました。wchar_t!=unsignedshort。あなたは確かにそれらが同じサイズであると仮定することはできません。

于 2009-08-27T12:36:38.623 に答える
0

検査するだけで、あなたのコードは機能すると思います。しかし、いつでも問題を回避できます。

ws.assign(static_cast<const wchar_t*>(arr), wcslen(arr));
于 2009-08-27T12:04:34.433 に答える