سؤال

وأنا أبحث عن ما يعادل 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

وهذا الشريط من الأحرف غير سلسلة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top