如何在 Swift 中间接显示给定的 unicode 字符?

How to display indirectly given unicode character in Swift?

在 JSON 数据文件中,我有一个这样的 unicode 字符:

{
    ”myUnicodeCharacter”: ”\u{25a1}”
}

我知道如何从 JSON 个文件中读取数据。当它包含如上表示的字符时,就会出现问题。

我将它读入一个字符串变量 myUnicodeCharacterString,它的值是“\u{25a1}”。顺便说一句,我不能在 JSON 数据文件中使用单斜杠,因为在这种情况下它无法将文件中的数据识别为正确的 JSON 对象,返回 nil。

然而,当值被分配给显示它的东西时,它没有被编码到它的图形表示中,例如 SKLabelNode:

mySKLabelNode.Text = myUnicodeCharacterString // displays ”\u{25a1}” and not a hollow square

问题归结为:

// A: direct approach, does works
let unicodeValueByValue = UnicodeScalar("\u{25a1}") // ”9633”
let c1 = Character(unicodeValueByValue) // ”a hollow square”

// B: indirect approach, this does not work
let myUnicodeString = "\u{25a1}"
let unicodeValueByVariable = UnicodeScalar(myUnicodeString) // Error: cannot find an initialiser
let c2 = Character(unicodeValueByVariable)

那么,如果没有在代码中直接给出格式为“\u{xxxx}”的unicode字符,如何显示呢?

我想出了一个解决方案,它没有回答问题,但实际上是一种更好的方法来做我想做的事情。

Unicode 字符在 JSON 数据文件中以十六进制值的形式给出,去除所有转义字符:

{
    ”myUnicodeCharacter”: ”25a1”
}

然后就这样处理了,把值读入myUnicodeCharacterString:

let num = Int(strtoul(myUnicodeCharacterString, nil, 16))
mySKLabelNode.Text = String(UnicodeScalar(num))

这奏效了。现在空心方块出现了。

更好的方法是使用正确的 \uNNNN 转义序列 对于 JSON 中的 Unicode 字符(有关详细信息,请参阅 http://json.org)。 这是由 NSJSONSerialization 自动处理的,而您不需要 必须转换十六进制代码。

在您的情况下,JSON 数据应该是

{
    "myUnicodeCharacter" : "\u25a1"
}

这是一个完整的独立示例:

let jsonString = "{ \"myUnicodeCharacter\" : \"\u25a1\"}"
println(jsonString)
// { "myUnicodeCharacter" : "\u25a1"}

let dict = NSJSONSerialization.JSONObjectWithData(jsonString.dataUsingEncoding(NSUTF8StringEncoding)!,
            options: nil, error: nil) as [String : String]

let myUnicodeCharacterString = dict["myUnicodeCharacter"]!
println(myUnicodeCharacterString)
// □

在Swift中,我们可以实现如下方案

让 jsonString = "{ "unicodeCharacter" : "\u00BD"}"

让数据 = jsonString.data(使用:.utf8) 如果让数据=数据{ 让 dict = 试试? JSONSerialization.jsonObject(with: data, options: []) 作为? [字符串:字符串]

print(dict?["unicodeCharacter"] ?? "")

}

输出:“½\n”