将Unicode字符进行Base64编码

19

Unicode字符能够使用Base64进行编码和解码吗?

我尝试对字符串'الله'进行编码,但是当我解码时只得到了'????'。


这取决于Base64例程如何获取数据,平台和代码是什么?当然可以的,答案是肯定的。 - Vinko Vrsalovic
数据正在Delphi中进行编码,然后在PHP中进行解码/使用。 - UnkwnTech
抱歉,我不了解Delphi。但是我提供了一个答案,证明这个问题与base64无关。 - Vinko Vrsalovic
虽然你可能正在PHP上解码,但你能否提供一个带有代码的实际示例?Unicode问题可能会很棘手,特别是跨语言/平台。 - Vinko Vrsalovic
对于 PHP 方面,我正在使用内置的 base64_decode 函数。 - UnkwnTech
如果您只是想要在URL格式(可能用于CSS)中使用Unicode/(任何其他字符),则可以使用SVG:list-style-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'><text>+</text></svg>") - laggingreflex
4个回答

24

Base64 将二进制转换为文本。如果您想将文本转换为 Base64 格式,则需要首先使用适当的编码(例如 UTF-8,UTF-16)将文本转换为二进制。


@think123:哪一部分?虽然我不懂PHP,但将任务分解成几个部分可能有助于您通过搜索找到答案。 - Jon Skeet
只是主要使用UTF-8将文本转换为二进制。 - Lucas
@think123 我怀疑搜索“PHP文本utf-8”会给你很多结果。如果你在阅读它们后还没有进展,我建议你提一个新问题。 - Jon Skeet
1
我找到了一个解决方案 - 在对base64_encodeutf8_encode字符串进行base64_decode后,只需对字符串进行utf8_decode即可。仅供参考。 - Lucas

17
当然可以。这取决于您的语言或Base64例程如何处理Unicode输入。例如,Python的例程期望一个编码字符串(因为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)
الله

4
请注意,返回的字符串不是一个Unicode对象。 应按以下方式解码:c = base64.b64decode(b).decode('utf-8') - DanJ

2
在.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);

2

您没有说明使用的是哪种语言,但可以尝试将字符串转换为字节数组(以您选择的语言方式完成),然后对该字节数组进行base64编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接