<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>さくらたんどっとびーず &#187; UnicodeEncodeError</title>
	<atom:link href="http://sakuratan.biz/archives/tag/unicodeencodeerror/feed" rel="self" type="application/rss+xml" />
	<link>http://sakuratan.biz</link>
	<description>モロモロ工事中です</description>
	<lastBuildDate>Sun, 25 Jun 2023 12:51:51 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Pythonのターミナルに出力する際に文字コード関係のエラーを抑制する</title>
		<link>http://sakuratan.biz/archives/5140</link>
		<comments>http://sakuratan.biz/archives/5140#comments</comments>
		<pubDate>Mon, 14 Nov 2011 10:06:55 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[UnicodeEncodeError]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=5140</guid>
		<description><![CDATA[Python 使ってると、日本語を表示する際に処理系が勝手に文字コードを変換しようとしてエラーが出て困ったりします。 こんな感じ↓のやつです。 &#62;&#62;&#62; print u'\uffff' Traceback &#40;most recent call last&#41;: &#160; File &#34;&#60;stdin&#62;&#34;, line 1, in &#60;mo... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/5140">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>Python 使ってると、日本語を表示する際に処理系が勝手に文字コードを変換しようとしてエラーが出て困ったりします。<br />
こんな感じ↓のやつです。</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> u<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\u</span>ffff'</span><br />
Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:<br />
&nbsp; File <span style="color: #483d8b;">&quot;&lt;stdin&gt;&quot;</span><span style="color: #66cc66;">,</span> line <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span><br />
<span style="color: #008000;">UnicodeEncodeError</span>: <span style="color: #483d8b;">'euc_jp'</span> codec can<span style="color: #483d8b;">'t encode character u'</span>\uffff<span style="color: #483d8b;">' in position 0:<br />
illegal multibyte sequence</span></div></div>
<hr class="linebreak">
<p>普段は放置してるのですがちょっと真剣に対応してみることにしました。<br />
（この手の情報欲しい人はある程度 Python 詳しい人だと思いますし）グダグダ説明するような話でも無いので細かい説明は抜きで解決方法だけ書こうと思います。</p>
<ol>
<li>以下のファイルを safe_terminal.py に保存。
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">codecs</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> find_encoding<span style="color: black;">&#40;</span>fh<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> fh.<span style="color: black;">encoding</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> fh.<span style="color: black;">encoding</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'utf-8'</span><br />
<br />
<span style="color: #808080; font-style: italic;">#error = 'ignore'</span><br />
error <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'backslashreplace'</span><br />
<span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span> <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">codecs</span>.<span style="color: black;">getwriter</span><span style="color: black;">&#40;</span>find_encoding<span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span><span style="color: #66cc66;">,</span> error<span style="color: black;">&#41;</span><br />
<span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span> <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">codecs</span>.<span style="color: black;">getwriter</span><span style="color: black;">&#40;</span>find_encoding<span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span><span style="color: #66cc66;">,</span> error<span style="color: black;">&#41;</span></div></div>
</li>
<li>print 等を使うプログラムで safe_terminal.py を import する。
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">import</span> safe_terminal<br />
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> u<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\u</span>ffff'</span><br />
\uffff</div></div>
</li>
</ol>
<p>こんな感じで stdout / stderr に対する print や write 時に変換できない文字をバックスラッシュでエスケープするのが便利かと思います。Python に含まれるライブラリ自体を書き換える方法もありますが、サーバ何台も扱ってると面倒なのでパスって感じです。</p>
<p>変換できない文字を非表示にしたい場合は error = &#8216;ignore&#8217; に変えてください。</p>
<h3>参考にしたページ</h3>
<p><a href="http://lab.hde.co.jp/2008/08/pythonunicodeencodeerror.html">PythonのUnicodeEncodeErrorを知る &#8211; HDEラボ</a><br />
<a href="http://osksn2.hep.sci.osaka-u.ac.jp/~taku/osx/python/encoding.html">Python でUTF-8, shift_jis, euc_jpなど日本語を使う方法</a></p>
<p>あじゃじゃしたーw</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/5140/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>
