我正在生成二维码,如果文字只有英文版,一切正常。当我想用一些阿拉伯文本生成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?谢谢
答案 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字符串分配空间,然后在不再需要它时释放它。