如何在 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”
在 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”