iOS中如何从字符串中识别带重音的字符?
识别字符串中的重音字符(Swift实现)
要精准识别带重音的字符(不管是预组合的重音字母,还是单独的重音标记),我们可以利用Swift的Unicode规范化特性和字符属性检查来实现。下面结合你的需求给出具体方案:
核心逻辑梳理
重音字符在Unicode体系里主要分两类:
- 独立重音标记:比如
̊(U+030A)这类非间距标记,本身就是一个独立的Unicode标量,属于「Mark」字符类别。 - 预组合重音字母:比如
å(U+00E5),它是单个Unicode标量,但通过**规范分解(NFD)**会拆分成基础字母a加上重音标记̊,因此分解后的标量数量会大于1。
通用判断函数
先写一个能同时识别这两类重音相关字符的通用函数:
func isAccentedCharacter(_ char: Character) -> Bool { let charScalars = char.unicodeScalars // 情况1:字符本身是重音标记(非间距/间距组合标记) if charScalars.count == 1 { let scalarProps = charScalars.first!.properties return scalarProps.isMark && (scalarProps.isNonSpacingMark || scalarProps.isSpacingCombiningMark) } // 情况2:预组合字符,分解后包含基础字母+重音标记 let nfdScalars = char.precomposedStringWithCanonicalMapping.unicodeScalars return nfdScalars.count > 1 }
针对你的示例字符串测试
用你提供的字符串验证,快速找出所有重音字符:
let str = "Hello, plåÅyground" // 过滤出所有重音字符 let accentedChars = str.filter(isAccentedCharacter) print("找到的重音字符:\(accentedChars)") // 输出:åÅ // 也可以遍历字符串,标记每个重音字符的位置 for (index, char) in str.enumerated() { if isAccentedCharacter(char) { print("重音字符 '\(char)' 位于索引 \(index)") } }
进阶:区分重音标记和带重音的字母
如果你需要单独区分「重音符号」和「带重音的字母」,可以拆分出两个更细分的函数:
// 判断是否是单独的重音标记 func isStandaloneAccentMark(_ char: Character) -> Bool { let scalars = char.unicodeScalars guard scalars.count == 1 else { return false } let props = scalars.first!.properties return props.isMark && (props.isNonSpacingMark || props.isSpacingCombiningMark) } // 判断是否是带重音的字母 func isLetterWithAccent(_ char: Character) -> Bool { let scalars = char.unicodeScalars // 首先得是字母类型 guard scalars.count == 1 && scalars.first!.properties.isLetter else { return false } // 分解后标量数>1,说明包含重音 let nfdScalars = char.precomposedStringWithCanonicalMapping.unicodeScalars return nfdScalars.count > 1 }
使用示例:
let testStr = "café à la carte ́" // 注意最后有个单独的重音标记 for char in testStr { if isLetterWithAccent(char) { print("带重音的字母:\(char)") } else if isStandaloneAccentMark(char) { print("单独的重音标记:\(char)") } } // 输出: // 带重音的字母:é // 带重音的字母:à // 单独的重音标记:́
内容的提问来源于stack exchange,提问作者3JT
相关产品推荐
相关产品推荐

