我需要将欧元符号转换为IKe =,并且它应该是base64编码

时间:2014-12-18 10:19:08

标签: python base64 ucs2

我必须将欧元符号发送到短信中。我得到了一些步骤,他们是:

  • 将€符号转换为十六进制,即:20AC
  • 将20AC编码为base64,其应为:IKw =

但是当我这样做时,使用我发现的任何在线工具,我总是得到MjBBQw ==,这是同样的python返回。

所以我想我在十六进制和base64之间缺少某种字符编码。

我的Python代码如下:

def encodeGSM7Message( text ):
     text = unicode( text, 'UTF-8' )
     hex_text = ''.join( [ hex( ord( c ) ).rstrip('L').lstrip('0x').upper() for c in text ] )
     return  base64.b64encode( hex_text )

print encodeGSM7Message( '€' ), 'IKw='

这件事应打印IKw= IKw=,但它会转到MjBBQw== IKw=

作为另一个例子,他们在字符串中添加了Ñ,所以我还有一个额外的代码行如下:

print encodeGSM7Message( '€ÑÑ' ), 'IKwA0QDR'

但不是打印IKwA0QDR IKwA0QDR,而应该是指定行为,而是打印MjBBQ0QxRDE= IKwA0QDR

对于我缺少什么,或者应该进行什么样的unicode转换以获得预期结果?

3 个答案:

答案 0 :(得分:1)

您不需要显式转换为十六进制。但是,您需要将16位unicode字符重新解释为2个8位字符:

def encodeGSM7Message( text ):
    text = unicode(text, 'UTF-8').encode('UTF-16be')
    return  base64.b64encode(text)

print encodeGSM7Message('€'), 'IKw='

答案 1 :(得分:1)

试试这个:

# -*- coding: utf-8 -*-

def encodeGSM7Message(s):
  return base64.b64encode( s.decode('utf8').encode('utf-16-be') )

euro = '€'

print encodeGSM7Message(euro)

注意coding: utf-8使euro变量utf-8编码,这就是我们在encodeGSM7Message例程中必须.decode('utf8')的原因。

答案 2 :(得分:0)

从结果向后工作,他们需要utf-16大端编码。

>>> base64.encodebytes('€'.encode('utf-16be'))
b'IKw=\n'