UTF-8 latin-1 problemas de conversión, python django

ok, así que mi problema es que tengo la cadena ‘\222\222\223\225’ que se almacena como latin-1 en la base de datos. ¿Qué puedo obtener de django (imprimiendo) es la siguiente cadena, ‘âââ⢒, que supongo que es la UTF de conversión de la misma. Ahora tengo que pasar la cadena a una función que
realiza esta operación:

strdecryptedPassword + chr(ord(c) - 3 - intCounter - 30)

Me sale este error:

chr() arg no en el rango(256)

Si me trate de codificar la cadena como latin-1 en primer lugar me sale este error:

‘latin-1’ codec no se puede codificar los caracteres en la posición de 0 a 3 años: ordinal no
en el rango(256)

He leído un montón sobre cómo la codificación de caracteres funciona, y hay algo que me estoy perdiendo porque yo no lo consigo!

InformationsquelleAutor jacob | 2008-11-08

3 Kommentare

  1. 4

    Su primer error ‘chr() arg no en el rango(256) probablemente significa que usted tiene underflowed el valor, porque chr no puede tomar valores negativos. No sé lo que el algoritmo de cifrado que se supone que debe hacer cuando el inputcounter + 33 es más que el carácter real de la representación, vas a tener que revisar qué hacer en ese caso.

    Sobre el segundo error. usted debe decodificar() y no encode() regular objeto string para obtener una representación adecuada de los datos. encode() toma un objeto unicode (los que empiezan con u’) y genera una cadena normal a la salida o por escrito a un archivo. decode() toma un objeto de cadena y a generar una unicode objeto con el correspondiente código de puntos. Esto se hace con el unicode() la llamada cuando se genera a partir de un objeto string, también se podría llamar a un.decode(‘latin-1’) en su lugar.

    >>> a = '\222\222\223\225'
    >>> u = unicode(a,'latin-1')
    >>> u
    u'\x92\x92\x93\x95'
    >>> print u.encode('utf-8')
    ÂÂÂÂ
    >>> print u.encode('utf-16')
    ÿþ
    >>> print u.encode('latin-1')
    
    >>> for c in u:
    ...   print chr(ord(c) - 3 - 0 -30)
    ...
    q
    q
    r
    t
    >>> for c in u:
    ...   print chr(ord(c) - 3 -200 -30)
    ...
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    ValueError: chr() arg not in range(256)
  2. 2

    Como Vinko notas, Latin-1 o ISO 8859-1 no tiene los caracteres imprimibles para el octal cadena de texto que se cita. Según mis notas para 8859-1, «C1 Controles (0x80 – 0x9F) son de la norma ISO/IEC 6429:1992. No define los nombres de los 80, 81, 99». El punto de código de nombres como Vinko listas de ellos:

    \222 = 0x92 => PRIVATE USE TWO
    \223 = 0x93 => SET TRANSMIT STATE
    \225 = 0x95 => MESSAGE WAITING

    La correcta codificación UTF-8 de los es (Unicode, binario, hexadecimal):

    U+0092 = %11000010 %10010010 = 0xC2 0x92
    U+0093 = %11000010 %10010011 = 0xC2 0x93
    U+0095 = %11000010 %10010101 = 0xC2 0x95

    La LETRA a minúscula LATINA CON acento CIRCUNFLEJO es el ISO 8859-1 código 0xE2 y, por tanto, Unicode U+00E2; en UTF-8, que es %11000011 %10100010 o 0xC3 0xA2.

    El SIGNO de CIENTO ISO 8859-1 código 0xA2 y, por tanto, Unicode U+00A2; en UTF-8, que es %11000011 %10000010 o 0xC3 0x82.

    Así, lo que están viendo, no parece estar viendo una codificación UTF-8 a ISO 8859-1. Todo lo demás aparte, están viendo pero 5 bytes donde tendría que ver 8.

    Añadido:
    La parte anterior de la respuesta de las direcciones de la ‘codificación UTF-8’ reclamación, pero se omite el resto de la pregunta, que dice:

    Now I need to pass the string into a function that does this operation:
    
        strdecryptedPassword + chr(ord(c) - 3 - intCounter - 30)
    
    I get this error: chr() arg not in range(256).  If I try to encode the
    string as Latin-1 first I get this error: 'latin-1' codec can't encode
    characters in position 0-3: ordinal not in range(256).

    Realidad no nos muestran cómo intCounter está definido, pero si se incrementa suavemente por carácter, más pronto o más tarde ‘ord(c) - 3 - intCounter - 30‘ va a ser negativo (y, por cierto, ¿por qué no combinar las constantes y el uso de ‘ord(c) - intCounter - 33‘?), en qué punto, chr() es probable que se quejan. Se necesitaría añadir 256, si el valor es negativo, o el uso de un módulo de operación para asegurarse de que tiene un valor positivo entre 0 y 255 para pasar a chr(). Ya que no podemos ver cómo intCounter se incrementa, no podemos saber si los ciclos de 0 a 255 o si se aumenta monótonamente. Si es esto último, entonces usted necesita una expresión tal como:

    chr(mod(ord(c) - mod(intCounter, 255) + 479, 255))

    donde 256 – 33 = 223, por supuesto, y 479 = 256 + 223. Esto garantiza que el valor pasado a chr() es positivo, y en el rango de 0..255 para cualquier carácter de entrada c y cualquier valor de intCounter (y, debido a la mod() función nunca consigue un argumento negativo, también funciona independientemente de cómo mod() se comporta cuando sus argumentos son negativos).

    • Todo eso es irrelevante, ya que él está utilizando un homebrew algoritmo de cifrado. Los bytes no están destinados a ser imprimible antes de la rutina de descifrado. Es por eso que he eliminado la información que poner aquí.
    • Mira como me trataba con el primer párrafo, y no para el resto. Voy a añadir un poco de material. Creo que veo un problema (no necesariamente ‘el’ problema, pero….).
  3. 0

    Bueno, porque su cifrados con una terrible esquema de que sólo cambia la ord() del personaje por parte de algunos solicitud, por lo que la cadena de salir de la base de datos ha sido cifrados y éste lo descifra. Lo que usted suministró anteriormente no parece funcionar. En la base de datos es latin-1, django convierte a unicode, pero no puedo pasarla a la función como unicode, pero cuando intento codificar a latin-1 veo que de error.

    • Por favor, poner algo de código real con un verdadero ejemplo de cadena, porque u’\222\222\223\225′.encode(‘latin-1’) a mi me funciona
    • y para c en u’\222\222\223\225′: print chr(ord(c) – 33) también funciona. Funciona bien con objetos de cadena.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea