2014-12-18 8 views
1

SMS에 유로 기호를 보내야합니다. 나는 그렇게 할 몇 가지 단계 주어졌다, 그들은 다음과 같습니다 = IKw :해야 64 기수로 20AC € uro 기호를 IKw =로 변환해야하며 base64 인코딩이되어야합니다

  • 인코딩, 20AC를 :

    • 은 진수의 € 기호 변환

      하지만 필자가 찾은 온라인 도구를 사용하면 언제나 같은 파이썬이 반환하는 MjBBQw ==를 얻을 수 있습니다.

      그래서 나는 16 진수와 base64 사이에 어떤 종류의 문자 인코딩을 놓치고 있습니다.

      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=에 가져옵니다 내가 가진

      파이썬 코드는 다음과 같다. 또 다른 예로서

      , 그들은 문자열 n을 추가, 그래서 다음과 같이 나 또한 여분의 코드 라인을 가지고 :

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

      을하지만 대신 spected 행동해야 IKwA0QDR IKwA0QDR를 인쇄, 그것은이 MjBBQ0QxRDE= IKwA0QDR 인쇄 종료

      내가 누락 된 부분에 대한 아이디어 또는 예상 결과를 얻기 위해 어떤 종류의 유니 코드 변환을해야합니까?

  • 답변

    1

    이 시도 : 그러나, 당신은이 8 비트 문자로 16 비트 유니 코드 문자를 재 해석해야합니까

    # -*- 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')해야하는 이유입니다.

    0

    결과에서 거꾸로 작업하면 utf-16 빅 엔디안 인코딩이 필요합니다.

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

    16 진수로 변환하지 않아도됩니다.

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