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

时间:2015-03-12 08:01:10

标签: json swift unicode

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

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

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

我将它读入一个String变量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字符?如果它没有直接在代码中给出?

2 个答案:

答案 0 :(得分:4)

更好的方法是使用正确的\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)
// □

答案 1 :(得分:0)

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

在JSON数据文件中将unicode字符替换为十六进制值,剥离所有转义字符:

{
    ”myUnicodeCharacter”: ”25a1”
}

然后在读取myUnicodeCharacterString中的值之后,它会像这样处理:

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

这很有效。现在空心方块出现了。