وظيفة هروب آمنة لإخراج المحطة
سؤال
وأنا أبحث عن ما يعادل urlencode للحصول على انتاج المحطة - ولست بحاجة للتأكد من أن الأحرف القمامة I (قد) طباعة من مصدر خارجي لا ينتهي فعل الأشياء غير تقليدي لمحطة بلدي، لذلك وظيفة الجاهزة للهروب تسلسل الأحرف الخاصة سيكون مثاليا
.وأنا أعمل في بيثون، ولكن أي شيء يمكن أن تترجم بسهولة الأعمال أيضا. TIA!
المحلول
$ ./command | cat -v $ cat --help | grep nonprinting -v, --show-nonprinting use ^ and M- notation, except for LFD and TAB
وهنا نفس الشيء في py3k استنادا <لأ href = "http://www.google.com/codesearch/p؟hl=en#2wSbThBwwIw/toolbox/cat.c&q=file:٪5Cbcat.c&l=-1 "يختلط =" نوفولو noreferrer "> الروبوت / cat.c :
#!/usr/bin/env python3
"""Emulate `cat -v` behaviour.
use ^ and M- notation, except for LFD and TAB
NOTE: python exits on ^Z in stdin on Windows
NOTE: newlines handling skewed towards interactive terminal.
Particularly, applying the conversion twice might *not* be a no-op
"""
import fileinput, sys
def escape(bytes):
for b in bytes:
assert 0 <= b < 0x100
if b in (0x09, 0x0a): # '\t\n'
yield b
continue
if b > 0x7f: # not ascii
yield 0x4d # 'M'
yield 0x2d # '-'
b &= 0x7f
if b < 0x20: # control char
yield 0x5e # '^'
b |= 0x40
elif b == 0x7f:
yield 0x5e # '^'
yield 0x3f # '?'
continue
yield b
if __name__ == '__main__':
write_bytes = sys.stdout.buffer.write
for bytes in fileinput.input(mode="rb"):
write_bytes(escape(bytes))
مثال:
$ perl -e"print map chr,0..0xff" > bytes.bin $ cat -v bytes.bin > cat-v.out $ python30 cat-v.py bytes.bin > python.out $ diff -s cat-v.out python.out
وويطبع:
Files cat-v.out and python.out are identical
نصائح أخرى
وأسف "إخراج محطة" هو المعيار محددة بشكل واضح جدا لتصفية (انظر <لأ href = "https://stackoverflow.com/questions/418176/why-does-pythons-string-printable-contains-unprintable-characters "> السؤال 418176 ). أود أن أقترح مجرد إدراجه في القائمة البيضاء الأحرف التي تريد السماح (والتي يمكن أن تكون أكثر من string.printable)، واستبدال كل الآخرين أيا كان الشكل الذي ترغب (\ FF،٪ FF، الخ) هرب، أو حتى مجرد تجريد بها.
إذا قطع الأشجار أو الإخراج والطباعة وتصحيح الأخطاء، وعادة ما تستخدم repr()
للحصول على نسخة قابلة للطباعة غير مؤذية للجسم، بما في ذلك السلاسل. هذا قد يكون أو لا يكون ما تريد. وcat --show-nonprinting
طريقة أخرى قد استخدمت في إجابات أخرى هو أفضل لكثير من الانتاج متعدد الخطوط.
x = get_weird_data()
print repr(x)
هل يمكن الأنابيب من خلال سلاسل
./command | strings
وهذا الشريط من الأحرف غير سلسلة