1

我正在生成 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];

在 Case#1 'getCString' 返回 true 并生成 QR 码,在 Case#2 返回 false 并无法生成代码。我应该怎么做,以便在 case#2 中它也应该返回 true ?谢谢

4

2 回答 2

4

length返回 Unicode 字符的数量。您必须使用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 由于两个可能的原因返回 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 字符串动态分配空间,然后在您不再需要它时释放它。

于 2013-01-31T21:58:46.183 回答