SwiftUI移除字符串引号时replacingOccurrences方法失效问题
问题原因
你当前的替换逻辑只匹配了ASCII编码的半角直引号 "(对应Unicode编码U+0022),也就是你在testA里手动写的引号类型。
从输入框拿到的moveAddy里残留的引号,是输入法/系统智能标点功能自动转换的非ASCII引号,和你写的匹配字符不是同一个,所以替换逻辑没命中。常见的这类引号包括:
- 左弯双引号
“(U+201C) - 右弯双引号
”(U+201D) - 中文全角双引号
"(U+FF02) - 单弯引号/全角单引号
‘、’、'
排查验证方法
你可以打印目标字符串每个字符的Unicode编码,直接确认未被替换的引号具体是哪种类型:
for scalar in testB.unicodeScalars { debugPrint("字符: \(scalar), 编码值: \(scalar.value)") }
对照Unicode编码表就能定位到具体字符。
可行解决方案
方案1:全量匹配所有引号类型做移除
把所有常见引号类型纳入过滤规则,不需要依赖输入源设置:
let allQuoteChars: Set<Character> = ["\"", "“", "”", """, "‘", "’", "'"] let testBtrimmed = testB.filter { !allQuoteChars.contains($0) }
如果排查到还有其他特殊引号类型,直接把对应字符加到上面的集合里即可。
方案2:从输入源头关闭智能引号转换
如果你的输入控件是UITextField(iOS)或者NSTextField(macOS),可以直接关闭智能引号替换功能,让用户输入的引号统一为半角直引号,原有替换逻辑就能正常生效:
// iOS UIKit 配置 textField.smartQuotesType = .no // macOS AppKit 配置 textField.isAutomaticQuoteSubstitutionEnabled = false
内容的提问来源于stack exchange,提问作者aa._.ron
相关产品推荐
相关产品推荐

