Base64ing Unicode символы - PullRequest
       10

Base64ing Unicode символы

17 голосов
/ 20 ноября 2008

Может Unicode символы быть закодированы и декодированы с Base64 ?

Я попытался закодировать строку 'الله', но когда я расшифровал ее, все, что я получил, было '????'.

Ответы [ 4 ]

19 голосов
/ 20 ноября 2008

Base64 преобразует двоичный файл в текст. Если вы хотите преобразовать текст в формат base64, вам нужно сначала преобразовать текст в двоичный файл, используя некоторую подходящую кодировку (например, UTF-8, UTF-16).

17 голосов
/ 20 ноября 2008

Конечно, они могут. Это зависит от того, как ваш язык или процедура Base64 обрабатывают ввод Unicode. Например, подпрограммы Python b64 ожидают закодированную строку (поскольку Base64 кодирует двоичный в текст, а не кодовые точки Unicode в текст).

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 голос
/ 28 марта 2010

В .NET вы можете попробовать это (кодировать):

byte[] encbuf;

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

... и декодировать:

byte[] decbuff;

decbuff = Convert.FromBase64String(this.ToString());
string decoded = System.Text.Encoding.Unicode.GetString(decbuff);
1 голос
/ 20 ноября 2008

Вы не указали, какой язык (языки) вы используете, но попробуйте преобразовать строку в байтовый массив (однако это делается на выбранном вами языке), а затем закодировать этот байтовый массив base64.

...