目标c不喜欢我的unichars?

时间:2010-01-28 01:55:01

标签: objective-c xcode gcc

当我尝试执行以下操作时,Xcode对“多字符字符包含”的抱怨:

static unichar accent characters[] = { 'ā', 'á', 'ă', 'à' };

如果不是所有字符都是ascii,你如何制作一个字符数组?以下工作正常

static unichar accent[] = { 'a', 'b', 'c' }; 

解决方法

我发现最接近的工作是将特殊字符转换为十六进制,即这有效:

static unichar accent characters[] = { 0x0100, 0x0101, 0x0102 };

3 个答案:

答案 0 :(得分:18)

不是Objective-C不喜欢它,而是C不这样做。常量'c'用于char,其中包含1个字节,而不是unichar,其中包含2个字节。 (有关详细信息,请参阅下面的注释。)

没有完全支持的方式来表示unichar常量。你可以使用

char* s="ü";

在UTF-8编码的源文件中获取unicode C-string或

NSString* s=@"ü";

在UTF-8编码的源文件中获取NSString。 (这在10.5之前是不可能的。对iPhone来说没问题。)

NSString本身在概念上是编码中立的;但如果您愿意,可以使用-characterAtIndex:获取unicode字符。

最后两条评论:

  • 如果您只想删除字符串中的重音符号,您可以使用这样的方法,而无需自己编写表格:

    -(NSString*)stringWithoutAccentsFromString:(NSString*)s
    {
        if (!s) return nil;
        NSMutableString *result = [NSMutableString stringWithString:s];
        CFStringFold((CFMutableStringRef)result, kCFCompareDiacriticInsensitive, NULL);
        return result;
    }
    

    请参阅CFStringFold

  • 的文件
  • 如果您想要unicode字符进行本地化/国际化,则不应将字符串嵌入源代码中。相反,您应该使用Localizable.stringsNSLocalizedString。见here

注意: 出于神秘的历史原因,'a'是C中的int,请参阅讨论here。在C ++中,它是char。但它并没有改变在'...'内写入多个字节是实现定义而不推荐的事实。例如,请参阅ISO C Standard 6.4.4.10。但是,在经典的Mac OS中,编写用单引号括起来的四字母代码很常见,例如'APPL'。但那是另一个故事......

另一个复杂因素是重音字母并不总是由1个字节表示;这取决于编码。在UTF-8中,它不是。在ISO-8859-1中,它是。 unichar应为UTF-16。您是否以UTF-16保存了源代码?我认为XCode的默认值是UTF-8。 GCC可能会根据设置进行一些编码转换......

答案 1 :(得分:7)

或者你可以这样做:

static unichar accent characters[] = { L'ā', L'á', L'ă', L'à' };

L是标准的C关键字,表示“我即将编写UNICODE字符或字符集”。

也适用于Objective-C。

注意:编译器可能会向你发出一个奇怪的警告,说明在unichar中放置了太多字符,但你可以放心地忽略该警告。 Xcode只是没有以正确的方式处理unicode字符,但是编译器正确解析它们并且结果没问题。

答案 2 :(得分:3)

根据您的具体情况,这可能是一种整洁的方式:

NSCharacterSet* accents = 
    [NSCharacterSet characterSetWithCharactersInString:@"āáăà"];

然后,如果你想检查一个给定的unichar是否是那些重音字符之一:

if ([accents characterIsMember:someOtherUnichar])
{
}

NSString还有许多方法可用于处理NSCharacterSet个对象。