2007/12/13, Robert Kern &lt;<a href="mailto:robert.kern@gmail.com">robert.kern@gmail.com</a>&gt;:<div><span class="gmail_quote"></span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>sys.setdefaultencoding() should not be used under any circumstances.<br><br></blockquote><div><br>If can not use sys.setdefaultencoding(<span style="font-family: courier new,monospace;"></span>), have to <span id="dropdownid">
<font class="engi">implement</font> </span>the behavior of setdefaultencoding by self.<br><br>Something like this, just as pyreadline does in unicode_helper.py, now can use ensure_unicode as unicode and ensure_str as str.
<br><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">import sys</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
try:</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; # Get system encoding at startup time.&nbsp; Certain terminals (like Emacs</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; # under Win32 have it set to None, and we need to have a known valid</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp; # encoding to use in the raw_input() method</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; codepage = sys.stdin.encoding or &#39;ascii&#39;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">except AttributeError:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # This error occurs when pdb imports readline and doctest has replaced </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # stdout with stdout collector</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; codepage = &quot;ascii&quot;&nbsp;&nbsp; # assume ascii codepage
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; </span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
def ensure_unicode(text, codepage=codepage):<br>&nbsp;&nbsp;&nbsp; # unicode, object does not have &#39;__str__&#39;<br>&nbsp;&nbsp;&nbsp; if isinstance(text, unicode) or not hasattr(text, &#39;__str__&#39;):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return unicode(text)<br><br>&nbsp;&nbsp;&nbsp; # str, object
<br>&nbsp;&nbsp;&nbsp; return str(text).decode(codepage, &quot;replace&quot;)<br><br><br>def ensure_str(text, codepage=codepage):<br>&nbsp;&nbsp;&nbsp; # unicode<br>&nbsp;&nbsp;&nbsp; if isinstance(text, unicode):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return text.encode(codepage, &quot;replace&quot;)
<br><br>&nbsp;&nbsp;&nbsp; # object, str, object does not have &#39;__str__&#39;<br>&nbsp;&nbsp;&nbsp; return str(text)<br><br></span><span class="q" id="q_116896858ac480a5_0">But you still </span>must be careful<span class="q" id="q_116896858ac480a5_0">
 in some </span>circumstances, <span class="q" id="q_116896858ac480a5_0">like this: <br><br>&nbsp;&nbsp;&nbsp; If s1 is unicode, s2 is str: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. &#39;%s, %s&#39; % (s1, s2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. &#39; &#39;.join([s1, s2])<br><br>The result will be unicode, so s2 will be decoded as &#39;
</span>ascii&#39;. <br>So you have to ensure_str or ensure_unicode s1 and s2 before.<span class="q" id="q_116896858ac480a5_0"><br></span><span style="font-family: courier new,monospace;"></span><span style="font-family: courier new,monospace;">
</span><span style="font-family: courier new,monospace;"></span></div></div>