在Obj-C中,我可以成功地附加在两个引号内的字节,如下所示:
[commands appendBytes:"\x1b\x61\x01"
length:sizeof("\x1b\x61\x01") - 1];
在Swift我想我会做类似的事情:
commands.appendBytes("\x1b\x61\x01", length: sizeof("\x1b\x61\x01") - 1)
但这会引发错误“文字中的无效转义序列”,如何在Swift中转义字节?
答案 0 :(得分:2)
如前所述,在Swift中,一个字符串存储Unicode字符,而不是 - 在(Objective-)C中 - 一个char
的任意(NUL终止)序列,它是一个签名
或大多数平台上的无符号字节。
现在理论上你可以从Swift字符串中检索一个C字符串:
let commands = NSMutableData()
let cmd = "\u{1b}\u{61}\u{01}"
cmd.withCString {
commands.appendBytes($0, length: 3)
}
println(commands) // <1b6101>
但这不会产生所有非ASCII字符的预期结果:
let commands = NSMutableData()
let cmd = "\u{1b}\u{c4}\u{01}"
cmd.withCString {
commands.appendBytes($0, length: 3)
}
println(commands) // <1bc384>
此处\u{c4}
是“Ä”,其中包含UTF-8表示C3 84
。
Swift字符串不能表示任意字节序列。
因此,您最好使用UInt8
数组来处理(二进制)控制序列:
let commands = NSMutableData()
let cmd : [UInt8] = [ 0x1b, 0x61, 0xc4, 0x01 ]
commands.appendBytes(cmd, length: cmd.count)
println(commands) // <1b61c401>
对于 text ,您必须知道打印机所期望的编码。
例如,NSISOLatin1StringEncoding
是ISO-8859-1编码,适用于“西欧”语言:
let text = "123Ö\n"
if let data = text.dataUsingEncoding(NSISOLatin1StringEncoding) {
commands.appendData(data)
println(commands) // 313233d6 0a>
} else {
println("conversion failed")
}
答案 1 :(得分:1)
Swift中的Unicode字符输入方式不同 - 您需要在十六进制数字周围添加花括号:
"\u{1b}\u{61}\u{01}"
为避免重复文字,请为其定义一个常量:
let toAppend = "\u{1b}\u{61}\u{01}"
commands.appendBytes(toAppend, length: toAppend.length - 1)