代码之家  ›  专栏  ›  技术社区  ›  corydoras

目标C不喜欢我的独角兽?

  •  8
  • corydoras  · 技术社区  · 16 年前

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

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

    当不是所有字符都是ASCII时,如何创建字符数组?下面的工作很好

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

    解决办法

    我找到的最接近的工作是将特殊字符转换为十六进制,即:

    static unichar accent characters[] = { 0x0100, 0x0101, 0x0102 };
    
    3 回复  |  直到 12 年前
        1
  •  18
  •   Community Mohan Dere    9 年前

    这不是客观的C不喜欢它,而是C不喜欢它。常数 'c' 是为了 char 它有1个字节,不是 unichar 它有2个字节。(请参阅下面的注释了解更多详细信息。)

    没有完全支持的方法来表示 尤尼卡 常量。你可以用

    char* s="ü";
    

    在utf-8编码的源文件中获取Unicode C字符串,或者

    NSString* s=@"ü";
    

    在一个utf-8编码的源文件中 NSString . (这在10.5之前是不可能的。iPhone没问题。)

    非字符串 它本身在概念上是非特定编码的;但是如果需要,可以使用 -characterAtIndex: .

    最后两条评论:

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

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

      见文件 CFStringFold .

    • 如果希望使用Unicode字符进行本地化/国际化,则不应在源代码中嵌入字符串。相反,你应该使用 Localizable.strings 和 NSLocalizedString . 见 here .

    注: 出于神秘的历史原因, 'a' 是一个 int 在C中,参见讨论 here . 在C++中,它是一个 烧焦 . 但这并不能改变这样一个事实:在内存中写入多个字节 '...' 是否定义了实现,不建议这样做。例如,请参见 ISO C Standard 6.4.4.10 . 然而,在经典的Mac操作系统中,编写用单引号括起来的四个字母的代码是很常见的,比如 'APPL' .但那是另一个故事…

    另一个复杂的问题是,重音字母并不总是用1字节表示;它取决于编码。在UTF-8中,它不是。在ISO-8859-1中,它是。和 尤尼卡 应该是UTF-16。你用UTF-16保存源代码了吗?我认为xcode的默认值是utf-8。GCC也可能根据设置进行一些编码转换…

        2
  •  7
  •   daniel.gindi    14 年前

    或者你可以这样做:

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

    L是一个标准的C关键字,它表示“我要写一个Unicode字符或字符集”。

    也适用于目标C。

    注意:编译器可能会对放在unichar中的字符过多发出奇怪的警告,但您可以安全地忽略该警告。Xcode只是没有以正确的方式处理Unicode字符,但是编译器对它们进行了正确的分析,结果是可以的。

        3
  •  3
  •   Matt Comi    12 年前

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

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

    然后,如果要检查给定的unichar是否是这些重音字符之一:

    if ([accents characterIsMember:someOtherUnichar])
    {
    }
    

    NSString 也有许多自己的处理方法 NSCharacterSet 物体。