1

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

  • 将€符号转换为十六进制,即: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 转换才能获得预期的结果?

4

3 回答 3

1

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

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

print encodeGSM7Message('€'), 'IKw='
于 2014-12-18T10:42:40.327 回答
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 编码,这就是我们必须.decode('utf8')在 encodeGSM7Message 例程中进行编码的原因。

于 2014-12-18T10:47:02.373 回答
0

从结果向后工作,他们想要 utf-16 big-endian 编码。

>>> base64.encodebytes('€'.encode('utf-16be'))
b'IKw=\n'
于 2014-12-18T10:42:16.073 回答