首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于阿拉伯语文本,NSString的方法'getCString‘返回false

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

Stack Overflow用户
提问于 2013-02-01 05:47:45
回答 2查看 1.5K关注 0票数 1

我正在生成二维码,如果文本只有英文,一切都很好。当我想生成一些阿拉伯文本的二维码时,它在NSString的方法"getCString:maxLength:encoding:“失败。

假设我有两个字符串:

代码语言:javascript
复制
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?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-01 06:07:02

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

代码语言:javascript
复制
NSUInteger arbLength = [englishArabicMixText lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1;
char strArb [arbLength];
[englishArabicMixText getCString:strArb maxLength:arbLength encoding:NSUTF8StringEncoding];
票数 4
EN

Stack Overflow用户

发布于 2013-02-01 05:58:46

2返回false的原因有两种:

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

2)用于存放编码字符串的缓冲区太小。

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

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

假设目标缓冲区需要的字节数与NSString的字符数相同

所以你应该这样做:

代码语言:javascript
复制
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字符串的空间,然后在不再需要它的时候释放它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14635759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档