[ios]Unicode 字符转换

发布时间: 2015/4/23 5:10:01
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我试图在 UITextView 中使用 unicode 字符 U + 00AE。如果我使用代码 \u{00AE} 使用如下:

textView.text = "THING AND STUFF TrademarkedThing\u{00AE}"

然而,如果从另一个位置 (这技术上来自 API 调用,但这并不重要),拉一些文本,并将其分配给 textView,我没有得到的 unicode 字符:

var apiText = "TrademarkedThing\u{00AE}" //Pulled from API call as text and saved into text variable
textView.text = "THING AND STUFF " + apiText

因此,在下面的代码中,第一个 unicode 字符并不显示,但第二个。

var apiText = "TrademarkedThing\u{00AE}" //Pulled from API call as text and saved into text variable
textView.text = "THING AND STUFF " + apiText + " \u{00AE}"

为什么不会从该文本 unicode 显示?

解决方法 1:

Unicode 转换 (从 \u{...} ) 仅发生的字符串。如果你比较一下这两个,你可以看到这一问题:

let t1 = "Thing\u{00AE}"
// Thing®
let t2 = "Thing\\u{00" + "AE}"
// Thing\u{00AE}

因为您的字符串来自另一个源,它像第二个。迅速的语言书有一节是关于Unicode 字符在字符串中


如果你想要解释那些 Unicode 序列之后,事实上,这里 String 扩展名:

extension String {
    func indexOfSubstring(str: String, fromIndex: String.Index? = nil) -> String.Index? {
        var index = fromIndex ?? startIndex

        while index < endIndex {
            if self[Range(start: index, end: endIndex)].hasPrefix(str) {
                return index
            }
            index = index.successor()
        }
        return nil
    }

    func convertedUnicodeSequences() -> String {
        if let index = indexOfSubstring("\\u{") {
            if let nextIndex = indexOfSubstring("}", fromIndex: index) {
                let substr = self[Range(start: advance(index, 3), end: nextIndex)]
                let scalar = UnicodeScalar(UInt32(strtoul(substr, nil, 16)))

                return self[Range(start: startIndex, end: index)] + 
                       String(scalar) + 
                       self[Range(start: nextIndex.successor(), end: endIndex)].convertedUnicodeSequences()
            }
        }

        return self
    }
}
官方微信
官方QQ群
31647020