如何在字符串文字中表示utf8十六进制字符



在下面的代码中,我试图将某些Data的前六个字节与utf8字符串文字进行比较,(在C中(我可以将其表示为"x93NUMPY"。但这不是在Swift中表示字符串文字的有效方法。因此,我使用了unicode字符u093,它在utf8中有两个字节长,并对1..7中的字符串数据进行了索引,这很有效,但。。。Yuk.

let magic = "u{0093}NUMPY".data(using: .utf8)![1..<7]
guard  Data![0..<6] == magic else {
return
}

我应该如何重写这段代码以避免令人困惑的索引问题,同时仍然使用字符串文字?

您的方法不仅令人困惑,而且容易出错。它适用于这个特定的字节,因为U+0093的UTF-8表示恰好是C2 93。与U+00C0相同的方法将给出字节0x80,因为UTF-8表示是C3 80

您可以使用ISO Latin 1编码,它将Unicode代码点U+0000 .. U+00FF映射到字节0x00 .. 0xFF:

let magic = "u{0093}NUMPY".data(using: .isoLatin1)!
print(magic as NSData) // length = 6, bytes = 0x934e554d5059}

但实际上,我不会试图将任意字节放入字符串文字中,而是定义

let magic = Data([0x93]) + "NUMPY".utf8

相反。还请注意,您可以使用检查前缀的数据

guard data.starts(with: magic) else {
return
}

最新更新