7

ここで正しい用語を使用しているかどうかはわかりませんが、通常の文字セットからバイトをエスケープする場合は、printまたはdeparseメソッドでC表記を使用する必要があります(たとえば"\x05"、の代わりに)。"\005"

x <- "This is a \x05 symbol"
print(x)
[1] "This is a \005 symbol"

これを達成するためのネイティブな方法はありますか?

BSONを生成するためにこれが必要です:http://bsonspec.org/#/specification。すべての例では、明示的に\x05表記を使用しています。

4

2 に答える 2

2

の内部をハッキングするのprintは悪い考えのようです。cat代わりに、文字列を自分でエスケープし、最終的には余分なエスケープなしで文字列を印刷するために使用する必要があると思います。

を使用encodeStringして、最初のエスケープを実行したり、 8進数のエスケープgregexprを識別したり、 8進数を表す文字列をそれらの数値に変換したり、16進数で数値を出力したり、一致した部分を操作したりできます。プロセス全体は次のようになります。\0..strtoisprintfregenmatches

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進数のエスケープをのような\00516進数のエスケープに変換しますが\x05、のような他のエスケープシーケンスは、このような\t影響\aを受けないことに注意してください。それらに対処するためにさらに多くのコードが必要になる場合がありますが、上記には必要なすべての材料が含まれている必要があります。

参照するBSON仕様は、ほぼ確実に生のバイトを意味することに注意してください。文字列にコード5の文字が含まれている限り、"\x05"入力と同じように記述でき、その文字列をバイナリモードで目的の出力に書き込むことができます。 Rがその文字列をどのように出力するかはまったく問題ではありません。結局のところ、8進数\005と16進数\x05は、書き込む同じバイトの2つの表現にすぎません。

于 2012-08-06T14:40:58.017 に答える
-1

あなたcatのニーズに合っていますか?バックスラッシュをエスケープする必要があることに注意してください。

> x <- "This is a \\x05 symbol\n"
> cat(x)
This is a \x05 symbol
于 2012-08-06T01:02:36.187 に答える