title: Python: Convert utf-8 string to byte string
body: <p>I have the following function to parse a utf-8 string from a sequence of bytes</p>
  
  <p>Note -- 'length_size' is the number of bytes it take to represent the length of the utf-8 string</p>
  
  <pre><code>def parse_utf8(self, bytes, length_size):
  
      length = bytes2int(bytes[0:length_size])
      value = ''.join(['%c' % b for b in bytes[length_size:length_size+length]])
      return value
  
  
  def bytes2int(raw_bytes, signed=False):
      """
      Convert a string of bytes to an integer (assumes little-endian byte order)
      """
      if len(raw_bytes) == 0:
          return None
      fmt = {1:'B', 2:'H', 4:'I', 8:'Q'}[len(raw_bytes)]
      if signed:
          fmt = fmt.lower()
      return struct.unpack('&lt;'+fmt, raw_bytes)[0]
  </code></pre>
  
  <p>I'd like to write the function in reverse -- i.e. a function that will take a utf-8 encoded string and return it's representation as a byte string. </p>
  
  <p>So far, I have the following:</p>
  
  <pre><code>def create_utf8(self, utf8_string):
      return utf8_string.encode('utf-8')
  </code></pre>
  
  <p>I run into the following error when attempting to test it:</p>
  
  <pre><code>  File "writer.py", line 229, in create_utf8
  return utf8_string.encode('utf-8')
  UnicodeDecodeError: 'ascii' codec can't decode byte 0x98 in position 0: ordinal not in range(128)
  </code></pre>
  
  <p>If possible, I'd like to adopt a structure for the code similar to the parse_utf8 example. What am I doing wrong?</p>
  
  <p>Thank you for your help!</p>
  
  <p><strong>UPDATE: test driver, now correct</strong></p>
  
  <pre><code>def random_utf8_seq(self, length):
      # from http://www.w3.org/2001/06/utf-8-test/postscript-utf-8.html
      test_charset = u" !\"#$%&amp;'()*+,-./0123456789:;&lt;=&gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­ ®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĂăĄąĆćČčĎďĐđĘęĚěĹĺĽľŁłŃńŇňŐőŒœŔŕŘřŚśŞşŠšŢţŤťŮůŰűŸŹźŻżŽžƒˆˇ˘˙˛˜˝–—‘’‚“”„†‡•…‰‹›€™"
  
      utf8_seq = u""
  
      for i in range(length):
          utf8_seq += random.choice(test_charset)
  
      return utf8_seq
  </code></pre>
  
  <p>I get the following error:</p>
  
  <pre><code>input_str = self.random_utf8_seq(200)
    File "writer.py", line 226, in random_utf8_seq
  print unicode(utf8_seq, "utf-8")
    UnicodeDecodeError: 'utf8' codec can't decode byte 0xbb in position 0: invalid start byte
  </code></pre>