对于阿拉伯语文本,NSString的方法'getCString'返回false

时间:2013-01-31 21:47:45

标签: ios objective-c nsstring arabic

我正在生成二维码,如果文字只有英文版,一切正常。当我想用一些阿拉伯文本生成QR码时,它在NSString的方法“getCString:maxLength:encoding:”时失败。

假设我有两个字符串:

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];

在案例#1中,“getCString”返回true并生成QR码,在案例#2中,它返回false并且无法生成代码。 我应该怎么做,以便在#2的情况下它也应该返回true?谢谢

2 个答案:

答案 0 :(得分:3)

length返回Unicode字符数。您必须使用lengthOfBytesUsingEncoding:,它返回以给定编码存储接收器所需的字节数。

NSUInteger arbLength = [englishArabicMixText lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1;
char strArb [arbLength];
[englishArabicMixText getCString:strArb maxLength:arbLength encoding:NSUTF8StringEncoding];

答案 1 :(得分:2)

由于两个可能的原因,

2返回false:

1)无法使用指定的编码转换字符串。

2)保存编码字符串的缓冲区太小。

我猜(或者至少我建议你开始调查)问题是nr。 2。

因为当您转换为UTF8时,单个未编码的字符可能会导致多个编码字符。 'A'是一个值为65的单字节,但是阿拉伯字符或某种符号可能需要更多的字节。

您假设您的目标缓冲区需要与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字符串分配空间,然后在不再需要它时释放它。