title: Python TypeError: expected a character buffer object, personal misunderstanding
body: <p>i was stuck at this error during a long time : </p>
  
  <pre><code> TypeError: expected a character buffer object
  </code></pre>
  
  <p>i just understand what i has misunderstood, it is something about a difference between an unicode string and a 'simple' string, i have tried to use the above code with a "normal" string, while i had to pass a unicode one. So forgeting the simple "u" before the string was breaking execution :/ !!!</p>
  
  <p>BTW the TypeError was very unclear to me, and is still.</p>
  
  <p>please, can some explain me what i was missing and why a "simple" string is NOT a "a character buffer object" ?</p>
  
  <p>you can reproduce with the code below (extracted and (c) from <a href="http://perso.limsi.fr/pointal/dev%3atreetaggerwrapper" rel="nofollow">here</a>: )</p>
  
  <pre><code>def maketransU(s1, s2, todel=u""):
      """Build translation table for use with unicode.translate().
  
      :param s1: string of characters to replace.
      :type s1: unicode
      :param s2: string of replacement characters (same order as in s1).
      :type s2: unicode
      :param todel: string of characters to remove.
      :type todel: unicode
      :return: translation table with character code -&gt; character code.
      :rtype: dict
      """
      # We go unicode internally - ensure callers are ok with that.
      assert (isinstance(s1,unicode))
      assert (isinstance(s2,unicode))
      trans_tab = dict( zip( map(ord, s1), map(ord, s2) ) )
      trans_tab.update( (ord(c),None) for c in todel )
      return trans_tab
  
  #BlankToSpace_table = string.maketrans (u"\r\n\t\v\f",u"     ")
  BlankToSpace_table = maketransU (u"\r\n\t\v\f",u"     ")
  def BlankToSpace(text) :
      """Replace blanks characters by realspaces.
  
      May be good to prepare for regular expressions &amp; Co based on whitespaces.
  
      :param  text: the text to clean from blanks.
      :type  text: string
      :return: List of parts in their apparition order.
      :rtype: [ string ]
      """
      print text, type(text), len(text)
      try:
          out =  text.translate(BlankToSpace_table)
      except TypeError, e:
          raise
      return out
  
  # for SO : the code below is just to reproduce what i did not understand
  dummy = "Hello,\n, this is a \t dummy test!"
  for s in (unicode(dummy), dummy):
      print repr(s)
      print repr(BlankToSpace(s))
  </code></pre>
  
  <p>producing : </p>
  
  <pre><code>u'Hello,\n, this is a \t dummy test!'
  Hello,
  , this is a      dummy test! &lt;type 'unicode'&gt; 32
  u'Hello, , this is a   dummy test!'
  'Hello,\n, this is a \t dummy test!'
  Hello,
  , this is a      dummy test! &lt;type 'str'&gt; 32
  
  Traceback (most recent call last):
    File "C:/treetaggerwrapper.error.py", line 44, in &lt;module&gt;
      print repr(BlankToSpace(s))
    File "C:/treetaggerwrapper.error.py", line 36, in BlankToSpace
      out =  text.translate(BlankToSpace_table)
  TypeError: expected a character buffer object
  </code></pre>