【问题标题】:Universal character name error in NSString when using unicode character, <使用 unicode 字符时,NSString 中的通用字符名称错误,<
【发布时间】:2013-06-17 19:24:18
【问题描述】:

我想在 NSString 中使用 '

"Character '<' cannot be specified by a universal character name"

当我使用时:

NSString *text = @"Some Text: \u003C"; 

''<':"some string &lt;" ?

我无法控制字符串值本身,上面的值作为 in-line 是出于演示目的。

【问题讨论】:

  • 好吧,NSString *text = @"Some Text: &gt;";?
  • @H2CO3 Maybe Will 需要一个框架来将 Unicode 代码点转换为常规字符
  • 很奇怪。我刚刚尝试过,对于许多不同的值,例如\u0020(空格)或`\u0041`(A),都会出现类似的错误。
  • @rmaddy - 是的,这很奇怪,但在标准中也这样定义“通用字符名称不应指定短标识符小于 00A0 的字符,而不是 0024 ($)、0040 ( @) 或 0060 ('),也不是 D800 到 DFFF 范围内的一个。”标准没有说明为什么他们提出了这个限制。
  • @114100웃 - 我引用了 C11 ISO 标准,第 6.4.3 节通用字符名称,第 2 段约束。如果您搜索 N1570,您应该会在网络上找到(草案)标准的 PDF 副本 - 或者您可以从 ISO 购买最终版本的 PDF。该段落有脚注:“不允许的字符是基本字符集中的字符和 ISO/IEC 10646 为控制字符、字符 DELETE 和 S-zone 保留的代码位置(保留供 UTF-16 使用) 。”但这并不能解释 reasoning 禁止可以输入的十六进制字符形式。 HTH。

标签: ios objective-c unicode


【解决方案1】:

我认为编译器错误没有得到解决。

对错误的回应:

"Character '<' cannot be specified by a universal character name"
"Universal character name refers to a control character"

您似乎不能对许多 2 字节 ASCII 字符使用 \U000000xx 文字语法,但以下情况除外:

  • \U00000024
  • \U00000040
  • \U00000060
  • \U000000A0\U000000FF

一个简单的解决方法是使用[NSString stringWithFormat:@"%C", 0x000000xx]

带有“

NSString *text = [NSString stringWithFormat:@"Hello %C", 0x003C]";

更多选项请参见xcode UTF-8 literals

【讨论】:

    【解决方案2】:

    如果该字符串是从包含“Hello \u003C”的文本文件中读取的,并带有 verbatim 反斜杠 那么你会有

    NSString *text = @"Hello \\u003C";
    

    如果文本文件只包含 ASCII 字符,那么 您可以使用 NSNonLossyASCIIStringEncoding 将“\uNNNN”解码为相应的 Unicode 字符的事实:

    NSData *data = [text dataUsingEncoding:NSASCIIStringEncoding];
    NSString *converted = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding];
    

    添加:您可能可以直接从文件中创建字符串

    NSString *text = [NSString stringWithContentsOfFile:pathToFile encoding:NSNonLossyASCIIStringEncoding error:NULL];
    

    并且所有 Unicode 转义序列都已正确转换。

    【讨论】:

    • 我会试试这个 - 关于为什么我不能将字符串直接放在 .m 文件中的任何解释,如示例代码中所示?
    • @Will:据我了解您的问题,文本文件包含反斜杠字符。要将反斜杠字符放入文字字符串或 NSString 中,必须将其转义为“\\”。
    • 我想我不明白为什么我可以在不转义的情况下使用一些 unicode 字符,但不能全部在 NSString 中使用。这被 clang 接受:@"Hello \u02C4 \u0502 \u0024" 而不是:@"Hello \u02C4 \u0502 \u0024 \u003C";
    • @Will:请参阅 CRD 对该问题的评论。 - 但是你说你从文本文件中读取字符串,所以你没有文字字符串。
    • 我做了,但是因为代码版本给出了警告,它激起了我的好奇心,如果在某个时候,我想内联定义它,我想更好地理解这个问题。
    【解决方案3】:

    clang 在这里遵循 C 标准,但出于某种原因不允许这样做:

    C99 6.4.3p2:通用字符名称不得指定短标识符小于 00A0 的字符,除了 0024 ($)、0040 (@) 或 0060 (`),也不得指定 D800 到 DFFF 范围内的字符包括在内。)

    【讨论】:

      猜你喜欢
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多