Swift中批量转换MySQL来源的变音字符乱码(如Neusäß转Neusäß)
解决Swift中Latin-1转UTF-8乱码的简便方法
这问题我之前也踩过坑!本质是字符编码的双重转换错误——第三方旧应用把UTF-8编码的字符串错误当成Latin-1(ISO-8859-1)写入了MySQL,读出来自然就变成了Neusäß这类乱码。不用逐个替换,直接利用Swift的编码转换就能一次性搞定所有这类问题。
原理说明
举个例子:正确字符ß的UTF-8编码是0xC3 0x9F,当被错误用Latin-1解码时,0xC3对应Ã,0x9F对应Ÿ,于是就出现了ß的乱码。反过来操作就能还原:把乱码字符串先转成Latin-1格式的Data,再用UTF-8解码这个Data,就能得到原本的正确字符串。
Swift实现代码
给String写个扩展,方便全局调用:
extension String { func fixLatin1UTF8Mismatch() -> String? { // 将乱码字符串转换为Latin-1编码的Data guard let latin1Data = self.data(using: .isoLatin1) else { return nil } // 用UTF-8解码Data,得到正确字符串 return String(data: latin1Data, encoding: .utf8) } }
使用示例
直接调用扩展方法即可:
let messedUpText = "Neusäß" if let fixedText = messedUpText.fixLatin1UTF8Mismatch() { print(fixedText) // 输出: Neusäß }
这个方法能一次性处理所有常见的变音字符乱码,比如ö转ö、ü转ü、ä转ä都能完美解决,比逐个写替换逻辑高效太多。如果遇到极个别特殊字符没处理好,可能是旧应用还有其他编码异常,但绝大多数这类场景下这个方法都能胜任。
内容的提问来源于stack exchange,提问作者Michael Baumgärtner
相关产品推荐
相关产品推荐

