首页 > 解决方案 > 3字节的unicode字符可以自动转换成ascii吗

问题描述

是否可以使用 Swift 字符串和编码自动将下面显示的两个“连字符”替代方案转换为 ascii“连字符”,而无需求助于调用的特定实例replacingOccurrencesOfWith

.replacingOccurrences(of: "—", with: "-")   // Replace "e2 80 94" (wide hyphen) with a normal hyphen
.replacingOccurrences(of: "‐", with: "-")   // Replace "e2 80 90" (narrow hyphen) with a normal hyphen

我目前正在使用该replacingOccurrencesOfWith函数来转换某些字符,当我尝试将包含字符串插入我的 MySQL 数据库时,这些字符会导致我的程序崩溃。由于有很多这样的有问题的字符(所有这些似乎都是 3 字节的 unicode),我最终需要一个巨大的replacingOccurrencesOfWith调用列表来处理它们。所以我正在寻找更有效的东西。

关于“自动”,我想知道是否有一个 Swift String 函数可以将unicode 字符降级为近似正确的 ascii 字符?例如; “ń”->“n”,“ó”->“o”,“ü”->“u”,以及“-”->“-”,“-”->“-”。

我需要转换这些字符的原因是,当我尝试将它们插入我的数据库时,MySqlSwiftNative 会返回 MySQL 错误,即使我已经为我的数据库/表设置了DEFAULT CHARACTER SET utf8mb4COLLATE utf8mb4_unicode_ci,并且可以使用 phpMyAdmin 直接将字符插入数据库。

MySqlSwiftNative(来自 GitHub/mcorega) - 可使用的原生 Swift MySQL API,遗憾的是,它在大约两年内没有任何活动。

标签: swiftstringunicodetransliteration

解决方案


您可以对 ASCII 进行“字符串转换”:

let text = "ń—ó‐ü"
let trans = text.applyingTransform(StringTransform(rawValue: "Latin-ASCII"), reverse: false)!
print(trans) // n-o-u


print(Array(text.unicodeScalars))
// ["\u{0144}", "\u{2014}", "\u{00F3}", "\u{2010}", "\u{00FC}"]

print(Array(trans.unicodeScalars))
// ["n", "-", "o", "-", "u"]

有关详细信息,请参阅


推荐阅读