我正在生成二维码,如果文本只有英文,一切都很好。当我想生成一些阿拉伯文本的二维码时,它在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,生成二维码,在Case#2返回false,生成代码失败。我应该怎么做,这样在case#2中它也应该返回true?谢谢
发布于 2013-02-01 06:07:02
length返回Unicode字符数。您必须使用lengthOfBytesUsingEncoding:,它返回以给定编码存储接收器所需的字节数。
NSUInteger arbLength = [englishArabicMixText lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1;
char strArb [arbLength];
[englishArabicMixText getCString:strArb maxLength:arbLength encoding:NSUTF8StringEncoding];发布于 2013-02-01 05:58:46
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字符串的空间,然后在不再需要它的时候释放它。
https://stackoverflow.com/questions/14635759
复制相似问题