0

我将一个字符串作为参数传递给用 swift 编写的命令行工具。

我对某些包含变音符号的字符有疑问。

à á ả ã ạ й ё如果我作为 line 参数传递,在我得到的应用程序内部à á ả ã ạ й ё。它看起来一样,但它不是:

func printUnicodeScalars(_ string: String) {
    print(string, "->", string.unicodeScalars.map { $0 })
}
printUnicodeScalars("à á ả ã ạ й ё")
// à á ả ã ạ й ё -> ["\u{00E0}", " ", "\u{00E1}", " ", "\u{1EA3}", " ", "\u{00E3}", " ", "\u{1EA1}", " ", "\u{0439}", " ", "\u{0451}"]
printUnicodeScalars("à á ả ã ạ й ё")
// à á ả ã ạ й ё -> ["a", "\u{0300}", " ", "a", "\u{0301}", " ", "a", "\u{0309}", " ", "a", "\u{0303}", " ", "a", "\u{0323}", " ", "\u{0438}", "\u{0306}", " ", "\u{0435}", "\u{0308}"]

我知道 ASCII 中的变音符号字符可以用不同的方式表示:像单个字符,或者像两个字符的组合:一个字母和一个变音符号。

出于某种原因,命令行工具将第一个变体转换为第二个变体。可能那是因为它仅限于 UTF-8。

我怎样才能把它转换回来?喜欢将许多 unicode-scalars 字符连接成一个字符。

4

1 回答 1

2

我认为你需要使用precomposedStringWithCanonicalMapping. 这会将字符串转换为规范化形式C,即:

规范分解,然后是规范组合

例子:

let string = "à á ả ã ạ й ё"
print(string.unicodeScalars.count) // 20
print(string.precomposedStringWithCanonicalMapping.unicodeScalars.count) // 13
于 2021-07-22T14:01:37.263 回答