2008-11-20 24 views
16

¿Pueden codificarse y decodificarse los caracteres Unicode con Base64?Caracteres Unicode de Base64ing

He intentado codificar la cadena 'الله', pero cuando decodifiqué todo lo que obtuve fue '????'.

+0

Dependería de cómo la rutina de base 64 es agarrar los datos, lo que es lo plataforma y el código? La respuesta es sí, pueden, por supuesto. –

+0

Los datos se codifican en Delphi y se decodifican/utilizan en PHP – UnkwnTech

+0

Lo sentimos, no hay ninguna pista sobre Delphi. Pero proporcioné una respuesta que demuestra que este problema no tiene nada que ver con base64 –

Respuesta

17

Base64 convierte binario a texto. Si desea convertir texto a un formato base64, primero deberá convertir el texto a binario con la codificación adecuada (por ejemplo, UTF-8, UTF-16).

+0

¿cómo haré eso, si estuviera trabajando en PHP? – think123

+0

@ think123: ¿Qué bit? No es probable que yo sepa de todos modos, sin saber PHP, pero dividir la tarea en bits es probable que te ayude a encontrar la respuesta mediante la búsqueda. –

+0

simplemente convirtiendo texto en binario usando UTF-8, principalmente. – think123

17

Por supuesto que pueden. Depende de cómo su lenguaje o rutina Base64 maneje la entrada Unicode. Por ejemplo, las rutinas de b64 de Python esperan una cadena codificada (como Base64 codifica el binario para el texto, no los puntos de código Unicode para el texto).

Python 2.5.1 (r251:54863, Jul 31 2008, 22:53:39) 
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> a = 'ûñö' 
>>> import base64 
>>> base64.b64encode(a) 
'w7vDscO2' 
>>> base64.b64decode('w7vDscO2') 
'\xc3\xbb\xc3\xb1\xc3\xb6' 
>>> print '\xc3\xbb\xc3\xb1\xc3\xb6' 
ûñö 
>>>  
>>> u'üñô' 
u'\xfc\xf1\xf4' 
>>> base64.b64encode(u'\xfc\xf1\xf4') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.5/base64.py", line 53, in b64encode 
    encoded = binascii.b2a_base64(s)[:-1] 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 
0-2: ordinal not in range(128) 
>>> base64.b64encode(u'\xfc\xf1\xf4'.encode('utf-8')) 
'w7zDscO0' 
>>> base64.b64decode('w7zDscO0') 
'\xc3\xbc\xc3\xb1\xc3\xb4' 
>>> print base64.b64decode('w7zDscO0') 
üñô 
>>> a = 'الله' 
>>> a 
'\xd8\xa7\xd9\x84\xd9\x84\xd9\x87' 
>>> base64.b64encode(a) 
'2KfZhNmE2Yc=' 
>>> b = base64.b64encode(a) 
>>> print base64.b64decode(b) 
الله 
+1

+1 para ejemplos –

+4

Me gustaría señalar que la cadena devuelta no es un objeto Unicode. debe decodificarse de la siguiente manera: c = base64.b64decode (b) .decode ('utf-8') – DanJ

1

No especificó qué idioma (s) está utilizando, pero intente convertir la cadena en una matriz de bytes (sin embargo, eso se hace en el idioma que prefiera) y luego base64 codificando esa matriz de bytes.

1

En .NET puede probar esto (codificar):

byte[] encbuf; 

encbuf = System.Text.Encoding.Unicode.GetBytes(input); 
string encoded = Convert.ToBase64String(encbuf); 

... y para decodificar:

byte[] decbuff; 

decbuff = Convert.FromBase64String(this.ToString()); 
string decoded = System.Text.Encoding.Unicode.GetString(decbuff);