2016-05-12 9 views
1

Ich möchte Integer-Code-Point von wenigen inländischen Zeichen in verschiedenen Kodierungen berechnen (ich bin sicher, dass alle diese Codecs diese Zeichen enthalten.). Mein Programm sieht wie folgt aus:Wie findet man eine Ganzzahl, die den Code eines Sonderzeichens darstellt? TypeError: ord() erwartete ein Zeichen, aber String der Länge 2 gefunden

characters = ['Č', 'č', 'Š', 'š', 'Ž', 'ž'] 
codecs = ['iso8859_2', 'cp1250', 'mac_latin2', 'utf-8', 'utf_16_le', 'utf_16_be'] 

for letter in characters: 
    for code in codecs: 
     print(letter + ' ' + code + ' ' + str(ord(letter.encode(code)))) 

Ausgang:

Č iso8859_2 200 
Č cp1250 200 
Traceback (most recent call last): 
    File "C:/Users/Miha/Documents/2Semester/IK/Vaja2/chrEncode.py", line 7, in <module> 
    print(letter + ' ' + code + ' ' + str(ord(letter.encode(code)))) 
TypeError: ord() expected a character, but string of length 2 found 
Č mac_latin2 137 

Antwort

0

Ich fand die Klassenmethode int.from_bytes(bytes, byteorder, *, signed=False), die den Job statt ord() erledigt. Code:

characters = ['Č', 'č', 'Š', 'š', 'Ž', 'ž'] 
codecs = ['cp852', 'iso8859_2', 'cp1250', 'mac_latin2', 'utf-8', 'utf_16_le', 'utf_16_be'] 

for letter in characters: 
    for codec in codecs: 
     decCodePoint = int.from_bytes(letter.encode(codec), byteorder='big') #code point integer 
     print(letter + ' ' + codec + ' ' + str(decCodePoint) + ' ' + str(hex(decCodePoint)) + ' ' + str(oct(decCodePoint))) #i also convert decimal integer to hexadecimal and octal 

Output nur für 'C':

Č cp852 172 0xac 0o254 
Č iso8859_2 200 0xc8 0o310 
Č cp1250 200 0xc8 0o310 
Č mac_latin2 137 0x89 0o211 
Č utf-8 50316 0xc48c 0o142214 
Č utf_16_le 3073 0xc01 0o6001 
Č utf_16_be 268 0x10c 0o414 
0

Next Code-Schnipsel kommentiert helfen könnte:

characters = ['Č'] #, 'č', 'Š', 'š', 'Ž', 'ž'] 
codecs = ['iso8859_2', 'cp1250', 'mac_latin2', 'utf-8', 'utf_16_le', 'utf_16_be'] 

for letter in characters: 
    for code in codecs: 
     charenc = letter.encode(code) 
     if len(charenc) == 1: 
      charcod = str(ord(letter.encode(code))) 
     else: 
      charcod = '0x' + ''.join('{:02X}'.format(charenc[i]) \ 
            for i in range(0,len(charenc))) 
     print( letter  + 
       ' U+'  + '{:04X}'.format(ord(letter)) + # Unicode codepoint (UCS-2) 
       ' (='  + str(ord(letter))    + # detto in decimal 
       '), length=' + str(len(charenc))   + # string length 
       ' '   + charcod      + # value 
       ' in '  + code       + # encoding 
       '') 

Ausgang:

D:\test\Python> python 37191263.py 
Č U+010C (=268), length=1 200 in iso8859_2 
Č U+010C (=268), length=1 200 in cp1250 
Č U+010C (=268), length=1 137 in mac_latin2 
Č U+010C (=268), length=2 0xC48C in utf-8 
Č U+010C (=268), length=2 0x0C01 in utf_16_le 
Č U+010C (=268), length=2 0x010C in utf_16_be 

Hier werden alle utf-8, utf_16_le und utf_16_be -konvertierten Werte in Hexadezimal gedruckt, aber die Umwandlung in Dezimal wäre keine problematische Aufgabe, obwohl Dezimalzahlen IMHO scheint nichts zu tun. Im Gegenteil, ich würde alle auch in anderen Fällen in hexadezimale konvertieren.

Entschuldigung, wenn meine Anpassung Ihres Skripts klein aussieht.
Es ist mein erstes Python-Treffen, da installiere ich es und versuche es erst, wenn es deine Frage ist ... Danke für die Inspiration zu einer neuen besonderen Erfahrung!

+0

Es funktionierte Weg, aber ich glaube, ich einfachere Lösung gefunden! Danke trotzdem! –