2014-10-11 98 views
0

在对象 - 我可以成功地追加封闭字节内的两个引号,像这样:追加字节到NSMutableData斯威夫特

[commands appendBytes:"\x1b\x61\x01" 
        length:sizeof("\x1b\x61\x01") - 1]; 

在斯威夫特我认为我会做这样的事情:

commands.appendBytes("\x1b\x61\x01", length: sizeof("\x1b\x61\x01") - 1) 

但是这会引发错误“文字中的无效转义序列”,我如何在Swift中转义字节?

回答

2

由于已经说过,在Swift中,一个字符串存储Unicode字符,而不是 - (在Objective-)C中 - 一个char的任意(NUL结尾)序列,在大多数平台上是有符号的 或无符号字节。

现在理论上你可以从斯威夫特字符串检索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> 

对于文本你必须知道哪些编码打印机的期望。 作为一个例子,NSISOLatin1StringEncodingISO-8859-1编码,其意在“西欧”语言:

let text = "123Ö\n" 
if let data = text.dataUsingEncoding(NSISOLatin1StringEncoding) { 
    commands.appendData(data) 
    println(commands) // 313233d6 0a> 
} else { 
    println("conversion failed") 
} 
+0

明白了,如果我想用其他文字输入Ä我想我会这样做? commands.appendData(“Test \ nAddress \ n \ u {c384} rtor \ n”.dataUsingEncoding(NSUTF8StringEncoding!)),但打印机实际上是打印8?(它的侧面是8)为什么? – 2014-10-11 15:10:00

+0

@SamPettersson:在Swift字符串中,您可以简单地编写“Ä”,或等效地为“\ u {c4}”。 \ u {c384}代表Unicode代码点U + C384 = HANGUL SYLLABLE SSE =쎄。该字符的UTF-8表示是“EC 8E 84”... - 对于更具体的答案,我们需要确切知道打印机打印“Ä”时应该使用哪个字节序列,特别是应使用哪种编码为人物。 – 2014-10-11 15:22:06

+0

如果我在我的字符串中写Ä我得到一个看起来像|-ä的字符? – 2014-10-11 15:22:54

1

斯威夫特Unicode字符输入的不同 - 你需要添加围绕六边形数量大括号:

"\u{1b}\u{61}\u{01}" 

为了避免重复的文字,定义一个常量它:

let toAppend = "\u{1b}\u{61}\u{01}" 
commands.appendBytes(toAppend, length: toAppend.length - 1) 
+0

的sizeof似乎不与类型toAppend去上班了,错误“‘字符串’是无法转换为'T.Type'“被抛出。 – 2014-10-11 13:14:56