que - python separar string por caracter
¿Cómo trato una cadena ASCII como unicode y desinstalo los caracteres escapados en python? (5)
Por ejemplo, si tengo una cadena Unicode , puedo codificarla como una cadena ASCII así:
>>> u''/u003cfoo//u003e''.encode(''ascii'')
''<foo/>''
Sin embargo, tengo, por ejemplo, esta cadena ASCII :
''/u003foo/u003e''
... que quiero convertir en la misma cadena ASCII que en mi primer ejemplo anterior:
''<foo/>''
En Python 2.5, la codificación correcta es "unicode_escape", no "unicode-escape" (observe el guión bajo).
No estoy seguro de si la versión más reciente de Python cambió el nombre Unicode, pero aquí solo funcionaba con el guión bajo.
De todos modos, esto es todo.
En algún momento se encontrará con problemas cuando encuentre caracteres especiales como caracteres chinos o emoticones en una cadena que quiera decodificar, es decir, errores que se vean así:
UnicodeEncodeError: ''ascii'' codec can''t encode characters in position 109-123: ordinal not in range(128)
Para mi caso (procesamiento de datos de twitter), decodifiqué de la siguiente manera para permitirme ver todos los caracteres sin errores
>>> s = ''/u003cfoo/u003e''
>>> s.decode( ''unicode-escape'' ).encode( ''utf-8'' )
>>> <foo>
Es un poco peligroso según el origen de la cuerda, pero ¿qué tal?
>>> s = ''/u003cfoo/u003e''
>>> eval(''u"''+s.replace(''"'', r''/"'')+''"'').encode(''ascii'')
''<foo>''
Me tomó un tiempo encontrarlo, pero esta página tuvo la mejor respuesta:
>>> s = ''/u003cfoo//u003e''
>>> s.decode( ''unicode-escape'' )
u''<foo/>''
>>> s.decode( ''unicode-escape'' ).encode( ''ascii'' )
''<foo/>''
También hay un códec ''escape-crudo-unicode'' para manejar la otra manera de especificar cadenas Unicode; consulte la sección "Constructores Unicode" de la página vinculada para obtener más detalles (ya que no soy ese Unicode-saavy).
EDITAR: Ver también Python Standard Encodings .
Ned Batchelder dijo:
Es un poco peligroso según el origen de la cuerda, pero ¿qué tal?
>>> s = ''/u003cfoo/u003e'' >>> eval(''u"''+s.replace(''"'', r''/"'')+''"'').encode(''ascii'') ''<foo>''
En realidad, este método puede ser seguro así:
>>> s = ''/u003cfoo/u003e''
>>> s_unescaped = eval(''u"""''+s.replace(''"'', r''/"'')+''-"""'')[:-1]
Tenga en cuenta la cadena de comillas triples y el guión justo antes de las 3 comillas de cierre.
- Usar una cadena de 3 comillas asegurará que si el usuario ingresa ''//' ''(espacios agregados para claridad visual) en la cadena, no interrumpiría al evaluador;
- El guión al final es a prueba de fallas en caso de que la cadena del usuario finalice con un ''/ "''. Antes de asignar el resultado, cortamos el guión insertado con [: -1]
Por lo tanto, no habría necesidad de preocuparse por lo que ingresan los usuarios, siempre que se capture en formato sin formato.