当我尝试执行以下操作时,Xcode对“多字符字符包含”的抱怨:
static unichar accent characters[] = { 'ā', 'á', 'ă', 'à' };
如果不是所有字符都是ascii,你如何制作一个字符数组?以下工作正常
static unichar accent[] = { 'a', 'b', 'c' };
我发现最接近的工作是将特殊字符转换为十六进制,即这有效:
static unichar accent characters[] = { 0x0100, 0x0101, 0x0102 };
答案 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。
Localizable.strings
和NSLocalizedString
。见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
个对象。