• ベストアンサー

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でどうにかならないかと思い試しているところです。 解決法があればお教えください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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でデコードする。 そうすれば、両方とも通る筈だ。

turu575
質問者

お礼

有り難うございます。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の場合は正しく読み込めるので漢字の処理で「簡体字」を使っているためかと思っていた。 再度お礼申し上げます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • pythonのQRコードデコードで文字化け問題 2

    前回の質問、「pythonのQRコードデコードで文字化けなくす 」でカタカナ混じりのテキストで文字化けが起きるた場合の回避策として例外処理の方法を教えてもらいその結果をテキストファイルの形で出力するため下記コードにしてみました。 import pyzbar.pyzbar from PIL import Image qr = pyzbar.pyzbar.decode(Image.open('d:/QRcode/qrcode_make.png')) #print(qr) try: with open('d:/QRcode/QRcode.txt', 'w') as f: print(qr[0].data.decode('utf-8').encode('shift-jis').decode('utf-8'), file=f) except UnicodeDecodeError: with open('d:/QRcode/QRcode.txt', 'w') as f: print(qr[0].data.decode('utf-8'), file=f) 前回の「いろはイロハ色波」「さけサケ鮭」のQRコード共に問題なくデコード結果が出力されました。 そこで頭に絵文字を加えた場合や韓国語・アラビア語等コピペしたテキストでQRコードを作りデコードした場合デコード結果が エラー(UnicodeEncodeError: 'cp932' codec can't encode character '\u231a' in position 0: illegal multibyte sequence)のためか出力されません。 因みに import qrcode text = 'text' img = qrcode.make(text) img.save('qrcode_make.png') でQRコードを生成 教えてもらったデコードの例外処理をする下記コードの結果 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')) 元テキスト:⌚さけサケ鮭 デコード結果:⌚さけサケ鮭 元テキスト:안녕 デコード結果:エラー(UnicodeEncodeError: 'shift_jis' codec can't encode character '\uc548' in position 0: illegal multibyte sequence encoding with 'shift-jis' codec failed) 例外処理をしない場合,デコード結果は「안녕」と読み込まれていました。 カタカナひらがな混じりのテキストを使う方に問題があるのかどうか分かりませんがせめて絵文字の場合だけでもテキストファイルへの正しく出力する方法をお教えください。

  • node-qrcodeのQRコードを画像で取得

    以前QRcode.jsで出力したQRコードを画像で取得する方法を教えてもらいましたが・・https://okwave.jp/qa/q100 今回は下記のようなnode-qrcodeを使った場合どうすれば出来るかお教えください。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <script src="https://cdn.jsdelivr.net/npm/qrcode@1.4.4/build/qrcode.min.js"></script> <script> document.addEventListener("DOMContentLoaded", () => { let info = "ひらがなQRサンプル" ; const options = { width: 128, height: 128, color: { dark: "#000000", // QRコードの自体 light: "#ffffff", // QRコードの背景 }, }; QRCode.toDataURL(info, options) .then((url) => { document.getElementById("qrcode").src = url; }) .catch((err) => { console.error(err); }); }); </script> </head> <body> <img id="qrcode" alt="QRコード" /> </body> </html> 前回のように 「QRコードを生成しているスクリプトの後ろに var canv = document.getElementsByTagName("canvas"); var image = canv[0].toDataURL("image/jpeg", 0.75 ); と書き足せば image 変数の中にJPEGデータが生成されます。」 では駄目でした。 よろしくお願いいたします。

  • QRcode.jsで生成したQRコードを画像で取得

    QRcode.jsを使い下記の下記のコードでQRコードを生成することが出来ます。しかし、そのコードをcanvasを使って画像として取得することは可能みたいですが、そのための方法が分かりません。検索してもjqueryを使用したのが多く占めただせさえjavascriptの素人には無理筋です。 <!DOCTYPE html> <html> <body> <div id="qrcode"></div> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js"></script> <script type="text/javascript"> var qrcode = new QRCode(document.getElementById("qrcode"), { text: "https://github.com", width: 128, height: 128, colorDark : "#ffffff", colorLight : "#000000", correctLevel : QRCode.CorrectLevel.H }); </script> </body> </html> 最終的には、var image = canvas.toDataURL()の形にして渡したいと思っています。 どうかよろしくお願いいたします。

  • QRコード・リーダー

    画像ファイルになっているQRコードをデコードするフリーのソフトってありますか?

  • 画像をQRコードに変換したいです。

    小さな画像ファイルをQRコードとして変換したいのですが、 何かいいツールはありませんか? QRコードの中にはバイナリデータも格納可能らしいので できるんだろう?と思っております。 (http://www.denso-wave.com/qrcode/aboutqr.html) できれば、ライセンスフリーのツールがあれば、うれしいです! よろしくお願いします。

  • QRコード・リーダー

    以下のURL以外で画像ファイルになっているQRコードをデコードするフリーのソフトってありますか? http://www.psytec.co.jp/

  • Excelで作成したQRコードをAccessに取り込む方法

    製品の履歴がわかるQRコードをラベルに貼りたいと考えています。 試験運用なので予算がなく 無料もしくは安価なソフトを探し Excelで生成するところまでは出来たのですが ラベルにする為にデーターをAccessに持って行ったところ やはり画像はインポートできませんでした。 1.AccessでQRコードを作成する無料もしくは安価で簡単な方法をご存知の方がいらっしゃいましたら教えて頂けませんでしょうか 2.又、そんなものはないという事であれば ExcelからWEBで書き出すとQRコードの画像だけが取り出せのでなんとか それを利用してAccessからラベル印刷できないかとヘルプから検索して試してみたのですが 同じQRコードしか出てきません。わかりやすい説明がされているサイトをご存知ないですか http://support.microsoft.com/default.aspx?scid=kb;ja-jp;285820 3.下記のソフトも試してみたのですが、個数が1000以上になるのでとてもコピペでは対応できませんでした。 http://www.vector.co.jp/soft/win95/writing/se341393.html プログラムの知識がほとんどないので、自力でやろうとするのが無謀だと悟り始めてはおりますが、最後にこちらにすがってみようと質問させて頂いています。よろしくお願いいたします。

  • 外部ファイルにしたら文字化けしてしまいました

    FC2ブログで下記【1】を <script type="text/javascript"> <!-- 【1】 // --> </script> で囲んで直接プラグインに書き込んだら 文字化けせずに表示されたのですが、 外部ファイルにして <script type="text/javascript" src="【1】のJSファイルのパス"></script> をプラグインに書き込んだら、 画像リンクはうまく表示されたのですが、 文字化けしてしまいました。 文字化けしない方法はないでしょうか? 【1】 // ランダムに画像を表示する jmp = new Array(); img = new Array(); // ジャンプ先のアドレス(数字は画像と対応) jmp[0] = "http://~"; jmp[1] = "http://~"; jmp[2] = "http://~"; jmp[3] = "http://~"; jmp[4] = "http://~"; // 画像のアドレス(数字はジャンプ先のアドレスと対応) img[0] = "img/img1.jpg"; img[1] = "img/img2.jpg"; img[2] = "img/img3.jpg"; img[3] = "img/img4.jpg"; img[4] = "img/img5.jpg"; n = Math.floor(Math.random()*jmp.length); document.write("<a href='"+jmp[n]+"' target='_blank'>"); document.write("<img src='"+img[n]+"' border='0'>"); document.write("</a>");

  • iQRコードの無料生成ソフト

    QRコードの生成ソフトはよく見かけますが、すごく狭いところにQRコードを付けたいと思い調べたところ iQRコード というものがある事を知りました。 それが使えるかどうか実験するのに、実際にiQRコードをパソコンで作成し、それが読み取れるか? を試したいと思っています。 「iQRコード」が生成出来る無料のパソコン用ソフトをご存じなら教えて下さい。 iQRコードとは  ↓ https://www.qrcode.com/codes/iqr.html#:~:text=iQR%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E3%80%81%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE,%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E7%94%9F%E6%88%90%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

  • base64encodeでの文字化けについて

    先日、PHPとjavascriptのエンコードについて質問をしました。 http://okwave.jp/qa/q8512040.html その後いろいろと試してみたところ、javascript上で 日本語の文字列に対してbase64_encodeをして、 base64_decodeをすると文字化けが起こりました。 ソースは以下の通りです。 <html> <head> <title>サンプル</title> <script type="text/JavaScript" src="base64.js"></script> </head> <body> <script type="text/javascript"> <!-- str="abcde12345あいうえお"; encode_str=base64encode(str); decode_str=base64decode(encode_str); document.write("元の文字列:"+str+"<br>変換後の文字列:"+decode_str); // --> </script> </body> </html> base64.jsは以下のサイトのものを使用しています。 http://www.onicos.com/staff/iz/amuse/javascript/expert/ 結果は以下の通りです。 元の文字列:abcde12345あいうえお 変換後の文字列:abcde12345BDFHJ 文字コードはUTF-8を使用しているのですが、他の文字コードで 試してみても文字化けします。 原因や対処方法がおわかりの方がいらっしゃれば、教えて下さい。 よろしくお願いします。