Domanda

Nel mio programma ottengo i codici di personaggio di Shift-JIS come numeri interi Python che devo convertirsi ai corrispondenti codici di caratteri UTF8 (che dovrebbero essere anche in numeri interi). Come lo posso fare? Per ASCII hai le funzioni utili ord ()/Chr () che consente di convertire un numero intero in una stringa ASCII che è possibile convertire facilmente in Unicode in seguito. Non riesco a trovare niente del genere per altre codifiche.

Usando Python 2.

EDIT: il codice finale. Grazie a tutti:

def shift_jis2unicode(charcode): # charcode is an integer
    if charcode <= 0xFF:
        string = chr(charcode)
    else:
        string = chr(charcode >> 8) + chr(charcode & 0xFF)

    return ord(string.decode('shift-jis'))

print shift_jis2unicode(8140)
È stato utile?

Soluzione

Non esistono "codici di caratteri UTF8 (che dovrebbero anche essere in numeri interi)".

Unicode definisce "punti di codice", che sono numeri interi. UTF-8 definisce come convertire quei punti di codice in un array di byte.

Così io pensare Vuoi i punti del codice Unicode. In quel caso:

def shift_jis2unicode(charcode): # charcode is an integer
    if charcode <= 0xFF:
        shift_jis_string = chr(charcode)
    else:
        shift_jis_string = chr(charcode >> 8) + chr(charcode & 0xFF)

    unicode_string = shift_jis_string.decode('shift-jis')

    assert len(unicode_string) == 1
    return ord(unicode_string)

print "U+%04X" % shift_jis2unicode(0x8144)
print "U+%04X" % shift_jis2unicode(0x51)

(Inoltre: non credo che 8100 sia un codice personaggio di shift-jis valido ...)

Altri suggerimenti

Potrebbe esserci un modo migliore per farlo, ma dal momento che non ci sono altre risposte eppure ecco un'opzione.

Potresti usare questo tavolo Per convertire i numeri interi di shift-jis in punti di codice Unicode, quindi utilizzare unichr() Per convertire i tuoi dati in un oggetto Unicode Python, quindi convertirli da Unicode in UTF8 utilizzando unicode.encode('utf-8').

def from_shift_jis(seq):
    chars = [chr(c) if c <= 0xff else chr(c>>8) + chr(c&0xff) for c in seq]
    return ''.join(chars).decode('shift-jis')

utf8_output = [ord(c) for c in from_shift_jis(shift_jis_input).encode('utf-8')]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top