1

私のiOS 5.1アプリケーションではwchar_t、文字列を使用するサードパーティのライブラリを使用しています。これは内部的には問題なく動作しますがNSString、そのような文字列用の を作成する必要がある場合があります。次の API を使用できます。

- (id)initWithBytes:(const void *)bytes length:(NSUInteger)length encoding:(NSStringEncoding)encoding

しかし、どのエンコーディングを使用すればよいのでしょうか? wchar_tiOS では 32 ビットであるため、候補のエンコーディングは次のとおりです。

NSUTF32StringEncoding
NSUTF32BigEndianStringEncoding
NSUTF32LittleEndianStringEncoding

どのバイトオーダーを使用すればよいですか? の結果に対応するエンコード バイト順を使用する必要がありlong NSHostByteOrder()ますか?

ところで、どのバイトオーダーをNSUTF32StringEncoding表しているのでしょうか? バイトを調べてバイト順を推測しますか? でNSStringから変換すると、何が得られgetBytes:maxLength:usedLength:encoding:options:range:remainingRange:ますか?

ここでは、プラットフォーム間のデータ交換には関心がないことに注意してください (ただし、いつかその問題に直面する必要があるかもしれません)。

グーグルで調べてもあまり役に立ちませんでした。

私の推測では、これはコンパイラによって定義されます。たとえば、次のように書くときに、コンパイラ (CLang) が使用するエンコーディングは何ですか?

wchar_t *s = L"string with non ascii unicode characters such as éèüçß";

もちろん、小さなサンプル プログラムを作成して調べるのは簡単ですが、コンパイラの特定の実装に依存しないソリューションが必要です。

私が混乱していると思うなら、それは私が少し混乱しているからです.

4

2 に答える 2

4

wchar_tこれが、Windows API を直接操作する必要がある場合を除いて、推奨できない理由です。

iOS ではwchar_t、ネイティブ バイト オーダーの UTF-32 です。これは技術的NSUTF32StringEncodingには、どちらかのバイト順を BOM で示すと同じではありません。

前回この質問に回答したときのコピー パスタを次に示します (リンク):

#include <machine/endian.h>
#if BYTE_ORDER == BIG_ENDIAN
#define WCHAR_ENCODING NSUTF32BigEndianStringEncoding
#elif BYTE_ORDER == LITTLE_ENDIAN
#define WCHAR_ENCODING NSUTF32LittleEndianStringEncoding
#endif

を使用する際の問題は、 に変換するNSUTF32StringEncoding場合にのみ機能し、必ずしもその逆であるとは限らないことです。前面に BOM が貼り付けられ (望ましくない)、間違ったエンディアンでデータが提供されることさえあります。wchar_tNSString

を使用すると からに移動しNSUTF32StringEncodingてもエラーが発生する可能性がありますが、その可能性は非常に低いです。wchar_tNSString

于 2012-05-23T22:51:18.027 に答える
0

すでに指摘したように、wchar_t*文字列がUTF-32でエンコードされていると想定するのは安全ではありません。

これについて非常に懸念していて、可能な限り堅牢にしたい場合は、wcstombs_l()を使用してwchar_t*文字列をUTF-8でエンコードされたchar*文字列に変換します。newlocale()で「UTF-8」ロケールを指定します。これにより、wchar_t*文字列がUTF-8でエンコードされたchar*文字列に確実に変換されます。mbstowcs_l()を使用して元に戻すことができます。

UTF-8でエンコードされたchar*を取得したら、NSUTF8StringEncodingを使用してNSString変換の設定をすべて行う必要があります。はい、それは余分なフープです。ただそれを飛び越えてください。

于 2012-05-24T00:36:25.397 に答える