の内部をハッキングするのprint
は悪い考えのようです。cat
代わりに、文字列を自分でエスケープし、最終的には余分なエスケープなしで文字列を印刷するために使用する必要があると思います。
を使用encodeString
して、最初のエスケープを実行したり、 8進数のエスケープgregexpr
を識別したり、 8進数を表す文字列をそれらの数値に変換したり、16進数で数値を出力したり、一致した部分を操作したりできます。プロセス全体は次のようになります。\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")
このアプローチは、のような8進数のエスケープをのような\005
16進数のエスケープに変換しますが\x05
、のような他のエスケープシーケンスは、このような\t
影響\a
を受けないことに注意してください。それらに対処するためにさらに多くのコードが必要になる場合がありますが、上記には必要なすべての材料が含まれている必要があります。
参照するBSON仕様は、ほぼ確実に生のバイトを意味することに注意してください。文字列にコード5の文字が含まれている限り、"\x05"
入力と同じように記述でき、その文字列をバイナリモードで目的の出力に書き込むことができます。 Rがその文字列をどのように出力するかはまったく問題ではありません。結局のところ、8進数\005
と16進数\x05
は、書き込む同じバイトの2つの表現にすぎません。