Можно ли кодировать и декодировать символы Юникод с помощью Base64?
Я попытался закодировать строку «الله», но когда я ее декодировал, все, что я получил, было «????».
Данные кодируются в Delphi и декодируются / используются в PHP.
Извините, я понятия не имею о Delphi. Но я дал ответ, который доказывает, что эта проблема не имеет ничего общего с base64.
Хотя может быть как ты на PHP декодируешь. Разве вы не можете предоставить реальный пример кода? Проблемы с Unicode могут быть сложными, особенно на разных языках / платформах
Что касается PHP, я использую встроенную функцию base64_decode.
Если вам просто нужен unicode / (любые другие символы) в формате URL (возможно, для CSS), вы можете использовать SVG: list-style-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'><text>+</text></svg>")





Конечно могут. Это зависит от того, как ваш язык или подпрограмма 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)
الله
Замечу лишь, что возвращаемая строка не является объектом Unicode. его нужно декодировать следующим образом: c = base64.b64decode (b) .decode ('utf-8')
Base64 преобразует двоичный в текст. Если вы хотите преобразовать текст в формат base64, вам нужно сначала преобразовать текст в двоичный, используя соответствующую кодировку (например, UTF-8, UTF-16).
@ think123: Какой бит? Не то, чтобы я все равно знал, не знаю PHP, но разбиение задачи на части, вероятно, поможет вам найти ответ через поиск.
просто преобразование текста в двоичный код, в основном, с использованием UTF-8.
@ think123 Я подозреваю, что поиск по запросу «PHP text utf-8» даст вам несколько результатов. Если после их прочтения вы ничего не добьетесь, я предлагаю вам задать новый вопрос.
Я нашел решение - просто utf8_decode строка после base64_decode, вставившая строку base64_encoded utf8_encoded. Просто для справки в будущем.
Вы не указали, какой язык (и) вы используете, но попробуйте преобразовать строку в массив байтов (однако это делается на выбранном вами языке), а затем закодируйте этот массив байтов в кодировке base64.
В .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);
Это будет зависеть от того, как процедура Base64 собирает данные, какова платформа и какой код? Ответ: да, конечно, могут.