- ベストアンサー
pythonのQRコードデコードで文字化けなくす
下記のコードでQRコードの画像ファイルを作り import qrcode text = 'さけサケ鮭' img = qrcode.make(text) img.save('qrcode_make_test1.jpg') 次にこの画像ファイルから下記コードでデコード処理をしたとろ文字化けが発生しました。 import pyzbar.pyzbar from PIL import Image qr = pyzbar.pyzbar.decode(Image.open('qrcode_make_test1.jpg')) print(qr) print(qr[0].data.decode()) デコード結果:縺輔¢繧オ繧ア魄ュ 例えば「いろはイロハ色波」の場合は問題なくデコードされますが「さけサケ鮭」等では文字化けとなります。 この画像をwebの変換サイトで試すと大概の場合問題なくデコードされます。このことは、filemakerでもjsで画像生成しデコードすると生成するJSによって同じ現象が見られ解決方法が見つからなかったのでpythonでどうにかならないかと思い試しているところです。 解決法があればお教えください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
ん〜。バグっぽいね。 っつーか、pyzbarのバグと言うよか、Python 3自体のバグ。 元々、Pythonって2.x時代で文字コードのエンコーディング/デコーディングがあまり良く無かったんだよ。原則ASCII文字しか受け付けない言語処理系でさ。 Python 3.xになってからUTF-8基本になったんだけど、それでも深いトコでちょくちょくエンコーディング/デコーディングの「不完全さ」が顔を出す。 これも、恐らくそういった次元のバグだと思う。 デコード処理のコードを次のように変えてみて。 https://www.ideone.com/BKCTq6 例外処理を使って、最初にUTF-8でデコードしたブツをShift-JISでエンコーディングし直してまたUTF-8でエンコードする。 そうすれば 'さけサケ鮭'は通るだろう。 一方、それじゃ'いろはイロハ色波'は通らなくなる。UnicodeDecodeErrorが投げられるだろう。 それを例外処理のexcept節でキャッチして、その場合には素直にUTF-8でデコードする。 そうすれば、両方とも通る筈だ。
お礼
有り難うございます。exceptで再処理する下記の方法で両方とも正しくデコードできました。 print(qr) try: print(qr[0].data.decode('utf-8').encode('shift-jis').decode('utf-8')) except UnicodeDecodeError: print(qr[0].data.decode('utf-8')) 余談ですが、filemakerのデコード関数の場合も同じ問題を含んでいるだろうか?・・・処理言語をUnicodeにすると日本語で通らない文字があるの等の指摘もあるので・・・jQuery.qrcode.jsで生成すれば正しく読み込めないがQRcode.jsの場合は正しく読み込めるので漢字の処理で「簡体字」を使っているためかと思っていた。 再度お礼申し上げます。