1

QRコードを生成していますが、テキストが英語のみの場合はすべて正常に機能しています。アラビア語のテキストを使用してQRコードを生成したい場合、NSStringのメソッド「getCString:maxLength:encoding:」で失敗します。

2つの文字列があるとします。

NSString *englishText = @"Some text English";
NSString *englishArabicMixText = @"Some text بالعربي";

char strEng [[englishText length] + 1];
char strArb [[englishArabicMixText length] + 1];

1- [englishText getCString:strEng maxLength:[englishText length] + 1 encoding:NSUTF8StringEncoding];
2- [englishArabicMixText getCString:strArb maxLength:[englishArabicMixText length] + 1 encoding:NSUTF8StringEncoding];

Case#1では'getCString'はtrueを返し、QRコードが生成され、Case#2ではfalseを返し、コードの生成に失敗しました。ケース#2でもtrueを返すようにするにはどうすればよいですか?ありがとうございました

4

2 に答える 2

4

lengthUnicode 文字の数を返します。を使用するlengthOfBytesUsingEncoding:必要があります。これは、受信者を特定のエンコーディングで格納するために必要なバイト数を返します。

NSUInteger arbLength = [englishArabicMixText lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1;
char strArb [arbLength];
[englishArabicMixText getCString:strArb maxLength:arbLength encoding:NSUTF8StringEncoding];
于 2013-01-31T22:07:01.903 に答える
2

2 は、考えられる 2 つの理由のいずれかで false を返します。

1) 指定されたエンコーディングで文字列を変換できません。

2) エンコードされた文字列を保持するバッファが小さすぎます。

問題は nr だと思います (または、少なくとも調査を開始することをお勧めします)。2.

UTF8 に変換すると、エンコードされていない単一の文字が複数のエンコードされた文字になる可能性があるためです。'A' は値 65 の 1 バイトですが、アラビア文字やある種の記号にはそれ以上のバイト数が必要になる場合があります。

宛先バッファには、NSStringの同じ文字数と同じバイト数が必要であると想定しています

したがって、次のようにする必要があります。

NSUInteger size = [englishArabicMixText lengthOfBytesUsingEncoding : NSUTF8StringEncoding];

if(size>0)
{
    size++;

    strArb = malloc(size);  // NOTE: you should allocate space for your string at runtime!!

    [englishArabicMixText getCString:strArb maxLength:size encoding:NSUTF8StringEncoding];
}

プレーンな英語の文字列についても同じことを行う必要があります。

また、実行時に malloc を使用して C 文字列の領域を動的に割り当て、必要がなくなったら解放することをお勧めします。

于 2013-01-31T21:58:46.183 に答える