首页 > 解决方案 > Objective-C 一些特殊的 char 无法控制地改变

问题描述

我有一个包含一些特殊字符(如 é、â、î、ı 等)的字符串,当我在此字符串上使用子字符串时。我遇到不一致的结果。一些特殊的字符变化不受控制

在此处输入图像描述

标签: iosobjective-c

解决方案


您假设这些都是字符

[newword substringWithRange:NSMakeRange(0,1)];    
[newword substringWithRange:NSMakeRange(1,1)];
[newword substringWithRange:NSMakeRange(2,1)];    
[newword substringWithRange:NSMakeRange(3,1)];
// and so on...

换句话说,您认为:

  • Alocation总是落在字符的开头。
  • 一个字符总是有length1。

两种假设都是错误的。请阅读 Apple字符串编程指南此处)的字符和字素簇章节。

é的长度恰好是 2,因为它是一个基本字母e,后跟一个组合变音符号。如果您希望它的长度为 1,则需要在使用它之前对字符串进行规范化。调用precomposedStringWithCanonicalMapping并使用生成的字符串。

示例和证明(在 Swift 中,但没关系,因为我始终使用 NSString):

let s = "é,â,î,ı" as NSString
let c = s.substring(with: NSRange(location: 0, length: 1)) // e
let s2 = s.precomposedStringWithCanonicalMapping as NSString
let c2 = s2.substring(with: NSRange(location: 0, length: 1)) // é

推荐阅读