我必须将欧元符号发送到短信中。我得到了一些步骤,他们是:
但是当我这样做时,使用我发现的任何在线工具,我总是得到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转换以获得预期结果?
答案 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'