我需要把欧元符号转换成IKw=,它应该是base64编码

2024-06-28 19:24:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我得把欧元签发短信。我得到了一些这样做的步骤,它们是:

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


Tags: 工具代码text编码unicode符号步骤短信
3条回答

试试这个:

# -*- 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')。你知道吗

从结果向后看,他们需要utf-16大端编码。你知道吗

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

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

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

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

相关问题 更多 >