2009-08-19 7 views
0

für die Analyse Ich würde URL-codierte Binärzeichenfolgen (nicht druckbare Zeichen am wahrscheinlichsten). Die Zeichenfolgen kommen leider in der erweiterten URL-codierenden Form, z. "% u616f". Ich möchte sie in einer Datei speichern, die dann die rohen Binärwerte enthält, z. 0x61 0x6f hier.Unesco/binäre Strings in (erweiterte) URL-Codierung in Python

Wie bekomme ich diese in binäre Daten in Python? (urllib.unquote behandelt nur die "% HH" -Form)

+0

Welche Version von Python? Bitte geben Sie einige Beispiele von dem, worüber Sie sprechen. Gib sie nicht ein. tue 'print repr (your_string)' wenn Python 2.x oder 'print (ascii (dein_string))' wenn Python 3.x, bearbeite deine Frage und kopiere/kopiere die Druckergebnisse. Woher bekommst du sie? –

Antwort

1

Ich denke, Sie müssen die Decoder-Funktion selbst schreiben. Hier ist eine Implementierung für den Einstieg:

def decode(file): 
    while True: 
     c = file.read(1) 
     if c == "": 
      # End of file 
      break 
     if c != "%": 
      # Not an escape sequence 
      yield c 
      continue 
     c = file.read(1) 
     if c != "u": 
      # One hex-byte 
      yield chr(int(c + file.read(1), 16)) 
      continue 
     # Two hex-bytes 
     yield chr(int(file.read(2), 16)) 
     yield chr(int(file.read(2), 16)) 

Verbrauch:

input = open("/path/to/input-file", "r") 
output = open("/path/to/output-file", "wb") 
output.writelines(decode(input)) 
output.close() 
input.close() 
0

Hier ist ein regex-basierter Ansatz:

# the replace function concatenates the two matches after 
# converting them from hex to ascii 
repfunc = lambda m: chr(int(m.group(1), 16))+chr(int(m.group(2), 16)) 

# the last parameter is the text you want to convert 
result = re.sub('%u(..)(..)', repfunc, '%u616f') 
print result 

gibt

ao 
3

Das Zeichenfolgen kommen leider in der erweiterten URL-codierenden Form, z. "% u616f"

Übrigens hat das nichts mit URL-Encoding zu tun. Es ist ein willkürlich erstelltes Format, das von der JavaScript-Funktion escape() erzeugt wird, und so gut wie nichts anderes. Wenn Sie können, wäre es am besten, das JavaScript so zu ändern, dass stattdessen die Funktion encodeURIComponent verwendet wird. Dadurch erhalten Sie eine korrekte URL-kodierte UTF-8-Zeichenfolge.

z.B. "% u616f". Ich möchte sie in einer Datei speichern, die dann die rohen Binärwerte enthält, z. 0x61 0x6f hier.

Sind Sie sicher 0x61 0x6f (die Buchstaben "ao") ist der Byte-Stream, den Sie speichern möchten? Das würde eine UTF-16BE-Codierung implizieren; Behandelst du all deine Saiten so?

Normalerweise möchten Sie die Eingabe in Unicode und dann schreiben Sie es mit einer geeigneten Codierung, wie UTF-8 oder UTF-16LE. Hier ist ein schneller Weg, es zu tun, die sich auf dem Hack von Python machen lesen '% u1234' als String-Escape-Format u '\ u1234':

>>> ex= 'hello %e9 %u616f' 
>>> ex.replace('%u', r'\u').replace('%', r'\x').decode('unicode-escape') 
u'hello \xe9 \u616f' 

>>> print _ 
hello é 慯 

>>> _.encode('utf-8') 
'hello \xc2\xa0 \xe6\x85\xaf'