2008/02/15

Pythonで「~」をエンコードすると例外が発生

Pythonで「~」をSJISやEUCにエンコードすると例外が発生します。

※cp932やmbcsを使用すれば例外は発生しません。

■検証したコード

#!/usr/bin/env python
# -*- coding: utf-8 -*-

s = u"~"

try:
s.encode("shift_jis")
print "shift_jis ok"
except UnicodeEncodeError, e:
print e

try:
s.encode("shift_jis_2004")
print "shift_jis_2004 ok"
except UnicodeEncodeError, e:
print e

try:
s.encode("shift_jisx0213")
print "shift_jisx0213 ok"
except UnicodeEncodeError, e:
print e

try:
s.encode("euc_jp")
print "euc_jp ok"
except UnicodeEncodeError, e:
print e

try:
s.encode("utf8")
print "utf8 ok"
except UnicodeEncodeError, e:
print e


上記のプログラムを実行すると・・・

'shift_jis' codec can't encode character u'\uff5e' in position 0: illegal multibyte sequence
'shift_jis_2004' codec can't encode character u'\uff5e' in position 0: illegal multibyte sequence
'shift_jisx0213' codec can't encode character u'\uff5e' in position 0: illegal multibyte sequence
'euc_jp' codec can't encode character u'\uff5e' in position 0: illegal multibyte sequence
utf8 ok

と表示されます。

文字コード「U+FF5E」を文字コード表で見てみると・・・


Fullwidth Tildeとなっており、さらにWebで調べるとWindowsの問題のようです。

WAVE DASH - FULLWIDTH TILDE問題

これはFullwidth TildeをWave Dashに変換すれば解決できるようです。


下記に修正したプログラムと出力結果を掲載します。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import string

s = u"~"
s = string.replace(s, u'\uff5e', u'\u301c')

try:
s.encode("shift_jis")
print "shift_jis ok"
except UnicodeEncodeError, e:
print e

try:
s.encode("shift_jis_2004")
print "shift_jis_2004 ok"
except UnicodeEncodeError, e:
print e

try:
s.encode("shift_jisx0213")
print "shift_jisx0213 ok"
except UnicodeEncodeError, e:
print e

try:
s.encode("euc_jp")
print "euc_jp ok"
except UnicodeEncodeError, e:
print e

try:
s.encode("utf8")
print "utf8 ok"
except UnicodeEncodeError, e:
print e


shift_jis ok
shift_jis_2004 ok
shift_jisx0213 ok
euc_jp ok
utf8 ok

ラベル:

0 件のコメント :

コメントを投稿

この投稿へのリンク :

リンクを作成

<< ホーム