2008-11-20 11 views
16

I caratteri Unicode possono essere codificati e decodificati con Base64?Base64ing Caratteri Unicode

Ho tentato di codificare la stringa "الله", ma quando ho decodificato tutto ciò che ho ottenuto era "????".

+0

Sarebbe dipenderà da come la routine Base64 è catturare i dati, qual è il piattaforma e il codice? La risposta è sì, possono, ovviamente. –

+0

I dati vengono codificati in Delphi e decodificati/utilizzati in PHP – UnkwnTech

+0

Spiacente, nessun indizio su Delphi. Ma ho fornito una risposta che dimostra che questo problema non ha nulla a che fare con base64 –

risposta

17

Base64 converte binario al testo. Se si desidera convertire il testo in un formato base64, è necessario convertire il testo in binario utilizzando prima la codifica appropriata (ad esempio UTF-8, UTF-16).

+0

come farei questo, se stavo lavorando in PHP? – think123

+0

@ think123: quale bit? Non è che probabilmente lo saprò comunque, non conoscendo il PHP, ma dividere il compito in bit ti aiuterà probabilmente a trovare la risposta attraverso la ricerca. –

+0

semplicemente convertendo il testo in binario usando UTF-8, principalmente. – think123

17

Certo che possono. Dipende da come la tua lingua o routine Base64 gestisce l'input Unicode. Ad esempio, le routine b64 di Python prevedono una stringa codificata (poiché Base64 codifica in formato binario in testo, non codepoints Unicode in testo).

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 per esempi –

+4

Vorrei solo notare che la stringa restituita non è un oggetto Unicode. dovrebbe essere decodificato come segue: c = base64.b64decode (b) .decode ('utf-8') – DanJ

1

Non hai specificato la lingua o le lingue che stai utilizzando, ma prova a convertire la stringa in una matrice di byte (tuttavia nella lingua prescelta) e quindi la codifica in base 64 quella matrice di byte.

1

In .NET si può provare questo (codifica):

byte[] encbuf; 

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

... e decodificare:

byte[] decbuff; 

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