UnicodeDecode error while printing line (#539258)

Alexander Belchenko bialix at ukr.net
Tue Mar 16 08:18:02 GMT 2010


Parth Malwankar пишет:
> Hello,
> 
> I am seeing a UnicodeDecodeError[1] in bzr-grep while
> writing to terminal.
> 
>    File "/home/parthm/.bazaar/plugins/grep/__init__.py", line 144, in run
>      verbose, self.outf)
>    File "/home/parthm/.bazaar/plugins/grep/grep.py", line 107, in
> workingtree_grep
>      include, exclude, verbose, outf, path_prefix)
>    File "/home/parthm/.bazaar/plugins/grep/grep.py", line 146, in dir_grep
>      print_revno, include, exclude, verbose, outf, path_prefix)
>    File "/home/parthm/.bazaar/plugins/grep/grep.py", line 240, in _file_grep
>      outf.write(pfmt % (line,))
>  UnicodeDecodeError: 'ascii' codec can't decode byte 0xa4 in position
> 7: ordinal not in range(128)
> 
> What is the suggested way to fix this? outf above is the instance attribute
> for the grep command derived from the Command class.

 From Command class help:

     encoding_type
         Command objects will get a 'outf' attribute, which has been
         setup to properly handle encoding of unicode strings.
         encoding_type determines what will happen when characters cannot
         be encoded
             strict - abort if we cannot decode
             replace - put in a bogus character (typically '?')
             exact - do not encode sys.stdout

             NOTE: by default on Windows, sys.stdout is opened as a text
             stream, therefore LF line-endings are converted to CRLF.
             When a command uses encoding_type = 'exact', then
             sys.stdout is forced to be a binary stream, and line-endings
             will not mangled.

To write lines of the versioned files you need to use
encoding_type = 'exact'

But for writing [possible] unicode text to the terminal you need to use 
'replace' in most situations.

So without looking at the code in your plugin I'd say you need 'exact'.

But if you need to use also unicode output then you need both 'exact' 
and 'replace'. This can be done although slightly non-trivial.

2 Martin Pool: I think UI class should provide both encoded and raw 
output stream. I'm not sure is it already done, so excuse me if this is 
already exists.




More information about the bazaar mailing list