不确定我在这里使用了正确的术语,但是当从常规字符集中转义字节时,我需要print
ordeparse
方法使用 C 表示法(例如"\x05"
,而不是)。"\005"
x <- "This is a \x05 symbol"
print(x)
[1] "This is a \005 symbol"
有没有一种本地方法可以做到这一点?
我需要这个来生成 BSON:http ://bsonspec.org/#/specification 。所有示例都明确使用\x05
符号。
侵入内部print
似乎是个坏主意。相反,我认为您应该自己进行字符串转义,并最终用于cat
打印字符串而无需任何额外的转义。
您可以使用encodeString
来进行初始转义、gregexpr
识别八进制\0..
转义、strtoi
将表示八进制数字的字符串转换为这些数字、sprintf
以十六进制打印数字以及regenmatches
对匹配的部分进行操作。整个过程看起来像这样:
inputString <- "This is a \005 symbol. \x13 is \\x13."
x <- encodeString(inputString)
m <- gregexpr("\\\\[0-3][0-7][0-7]", x)
charcodes <- strtoi(substring(regmatches(x, m)[[1]], 2, 4), 8)
regmatches(x, m) <- list(sprintf("\\x%02x", charcodes))
cat(x, "\n")
请注意,这种方法会将八进制转义转换\005
为十六进制转义\x05
,但其他转义序列\t
或\a
不会受此影响。您可能还需要更多代码来处理这些问题,但上面应该包含您需要的所有成分。
请注意,您提到的 BSON 规范几乎可以肯定是指原始字节,因此只要您的字符串包含一个代码为 5 的字符,您可以将其写入"\x05"
输入中,并且您将该字符串以二进制模式写入所需的输出,它R如何向您打印该字符串并不重要。毕竟,八进制\005
和十六进制\x05
只是您将要写入的同一字节的两种表示形式。
cat
符合你的需要吗?请注意,您必须转义反斜杠:
> x <- "This is a \\x05 symbol\n"
> cat(x)
This is a \x05 symbol