• ベストアンサー

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) 例外処理をしない場合,デコード結果は「안녕」と読み込まれていました。 カタカナひらがな混じりのテキストを使う方に問題があるのかどうか分かりませんがせめて絵文字の場合だけでもテキストファイルへの正しく出力する方法をお教えください。

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

  • ベストアンサー
回答No.2

エラーが起こっている部分を勘違いしていました。 printでファイルに書き込む段階でエラーになっているので、ファイルの文字コードを指定すればよさそうです。 with open('d:/QRcode/QRcode.txt', 'w', encoding='utf-8') as f: としたらどうでしょうか。

turu575
質問者

お礼

度々有り難うございます。お教え頂いた with open('QRcode.txt', 'w', encoding='utf-8') as f: print(decoded_str, file=f) でエラーなくデコードできました。 デコード結果:⏰さけサケ鮭 ソーステキスト:안녕 デコード結果:안녕 私もエラー内容で検索し、決定的な方法ではないがいけるみたいな記述があり もしかしたら「encoding=」は不要かと思い with open('QRcode.txt', 'w', 'utf-8') as f: 実行しましたが TypeError: 'str' object cannot be interpreted as an integer となり、私の方がはてなで状態で止まっていた状況です。 なお、今回使った下記コードの部分はそのままでもかまわないでしょうか retry_flg = False try: decoded_str = qr[0].data.decode('utf-8').encode('shift-jis').decode('utf-8') except UnicodeDecodeError: retry_flg = True except UnicodeEncodeError: retry_flg = True if retry_flg: decoded_str = qr[0].data.decode('utf-8')

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

その他の回答 (3)

回答No.4

TypeError: 'str' object cannot be interpreted as an integer こちらについて。 openの引数は、以下で確認できます。 https://docs.python.org/3.12/library/functions.html#open 引数名を省略すると、3番目の引数(buffering)として扱われるため、文字列だとエラーになります。

turu575
質問者

お礼

なるほど、'W'で省略されていたので何でも省略が可能だと思っていました。引数の内容まで確認せずコピペコードに始終していることに対し余計なお世話ばかりかけて申し訳ありません。 いろいろ有り難うございました。

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

except UnicodeEncodeError: retry_flg = True の部分はなくてもよさそうですが、残しておいても問題にはならないと思います。

turu575
質問者

お礼

有り難うございます。 そのままで行きます

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

UnicodeDecodeErrorだけを処理しているので、UnicodeEncodeErrorが起きた場合に対応できていないのが原因です。 exceptを2つ用意する方法と、基底クラスのUnicodeErrorをexceptで捕まえる方法がありますが、後者はUnicodeTranslateErrorも捕まえることになります(おそらく問題はないと思います) ただ、exceptの中でさらに例外が発生する可能性のある処理を行うことは推奨できません。 私なら、以下のようなコードにすると思います。ファイル操作も例外などの可能性があるので、デコード処理とは分離しています。 retry_flg = False try: decoded_str = qr[0].data.decode('utf-8').encode('shift-jis').decode('utf-8') except UnicodeDecodeError: retry_flg = True except UnicodeEncodeError: retry_flg = True if retry_flg: decoded_str = qr[0].data.decode('utf-8') with open('d:/QRcode/QRcode.txt', 'w') as f: print(decoded_str, file=f)

turu575
質問者

お礼

早速ありがとうございます。当方基本pytonに関わらずプログラミングは素人なので変なコードを書いていることお許しください。 下記のコードで試してみたところ import pyzbar.pyzbar from PIL import Image qr = pyzbar.pyzbar.decode(Image.open('qrcode_make.png')) #print(qr) retry_flg = False try: decoded_str = qr[0].data.decode('utf-8').encode('shift-jis').decode('utf-8') except UnicodeDecodeError: retry_flg = True except UnicodeEncodeError: retry_flg = True if retry_flg: decoded_str = qr[0].data.decode('utf-8') with open('QRcode.txt', 'w') as f: print(decoded_str, file=f) ソーステキスト:⏰さけサケ鮭 デコード結果:エラー エラー内容 Traceback (most recent call last): File "d:\Python\rqcode_4_3.py", line 15, in <module> print(decoded_str, file=f) UnicodeEncodeError: 'cp932' codec can't encode character '\u23f0' in position 0: illegal multibyte sequence となりました。なお絵文字をつけなければ問題なくデコードされます。単純にコピペだけでは問題があったのでしょうか

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

関連するQ&A

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

  • 文字コード変換

    送信元のページがShift_JISの場合は正常に動作するのですが、 UTF-8等の場合は文字化けしてしまいます。 &jcode'convert(*val, 'sjis'); ↑のものを use Encode; Encode::from_to( $val, "UTF8", "Shift_JIS", Encode::XMLCREF ); このように書いたところ、UTF-8も文字化けしないのですが、 コードを自動的に認識して自動で振り分けさせる方法がわかりません。 サーバーのPerlのバージョンは5.8.6です。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • pythonの文字コードについて

    pythonの各文字コードにおける日本語の扱われ方について分からないことがあります。 日本語1文字の長さはユニコード文字列では1、8ビット文字列では3という説明が参考書には書いてありました。しかし、実際に実行してみると私の環境では結果が異なりました。さらに文字化けまで起きてしまいました。なぜなのでしょうか?回答お願いいたします。 windowsを使用しており、バージョンはpython2.7です。 以下、私の環境下での実行結果です。 >>> ustr=u"あいうえお" >>> len(ustr) 10 >>> len(ustr.encode("utf-8")) 20 >>> print ustr ‚ ‚¢‚¤‚¦‚¨ >>> print ustr.encode("utf-8") ツつツつ「ツつ、ツつヲツつィ >>> ustr2="あいうえお" >>> len(ustr2) 10 >>> print ustr2 あいうえお

  • 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データが生成されます。」 では駄目でした。 よろしくお願いいたします。

  • 文字コードの変換(Shift-JISからUTF8)

    文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを 確認するとShift-JISのままです。 どなたか教えていただけないでしょうか? ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。 #!/usr/bin/perl use strict; use warnings; use utf8; use Encode; my $input_file="input.csv"; my $output_file="output.txt"; open (IN, $input_file) or die "$!"; open (OUT, ">$output_file") or die "$!"; while (<IN>){ chomp ($_); my @data=split(/,/,$_); for(my $i=0;$i<@data;$i++){ $data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換 $data[$i]=~s/\s+//g; print OUT $_; } print OUT "\n"; } close (IN); close (OUT);

    • ベストアンサー
    • Perl
  • 文字変換について

    Perlの文字変換について質問があります。 文字コードをJISからShift_JISに変換するには、下記のどれが正しい記述なのでしょうか? ・Encode::from_to($_, "jis", "shiftjis" ) ・encode("shiftjis", $_) ・encode("shiftjis", decode("utf8", $_)) 以上、よろしくお願い致します

    • ベストアンサー
    • Perl
  • Perlの文字コード変換についての質問です。

    Perlの文字コード変換についての質問です。 ホームページ全体は、UTF-8で作成されています。 そのため、$qsは、どうも、S-JISのようなので、UTF-8に変換して URLデコードさせたいのですがうまくいきません。 文字化けしないで、UTF-8で作成されたページに表示させたいのですがどうすればよいでしょうか? 宜しくお願い致します。 ------------------------------------ $qs = $ENV{'QUERY_STRING'}; use Encode::Guess qw/ shiftjis /; use Encode qw/ decode /; $enc = guess_encoding ( $qs ); if ( ref $enc ) { $utf8 = decode ( $enc->name , $qs ); } $qs =~ tr/+/ /; $qs =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; print "$qs";

    • ベストアンサー
    • Perl
  • テキストファイルの文字コードが

    フォルダの中にあるテキストファイルの文字コードが UTF-8なのかShift_JISなのか どうやって調べれば良いですか? プロパティを見てもわかりません。

  • Perl 文字コードについて

    From: $from To: $mailto CC: $mailcc Subject: $subject Mime-Version: 1.0 Content-type: text/plain;charset=\"UTF-8\" Content-Transfer-Encoding: 8bit この時点で、UTF-8を指定しました。 use Encode; use Encode::Guess; Encode::Guess->set_suspects( qw/ euc-jp shiftjis 7bit-jis / ); $name = encode('UTF-8', decode('Guess', $name)); で本文を、UTF-8に変換して送るようなコードを書きました。 これで一応、パソコン、スマホ共に「本文」は文字化けせず送れるのですが、 今度、別の問題が発生してしまったようで、 「件名」が文字化けしてしまうようになりました。 $subject = encode('UTF-8', decode('cp932', $subject)); 件名も、本文と同じように変換コードをしてみたところ、パソコンでは文字化けしませんでしたが「件名」で文字化けしてしまいます。 調べたところ本文と件名では、内容が違い MIMEエンコードを使用するとのことだったのですが、 実際どのように使うのかわからないです。 $subject = encode('ISO-2022-JP', decode('cp932', $subject)); encode('MIME-Header-ISO_2022_JP', $subject) このように記述するとスマホでは文字化けしないのですが パソコンで文字化けしてしまいます。 そこで、件名がパソコンとスマホで文字化けしないようにし、本文はUTF-8で送るようにするにはどのようにすればいいのでしょうか?

    • ベストアンサー
    • Perl
  • 文字コードが変わってしまう

    Webページ作成関連の市販のテキストについているサンプルコードを自分のマシンにコピーして勉強しています。WindowsXPとWindows7を使っています。 たとえば、【今日問題なく使った】のに、翌日同じHTMLファイルのソースを見たら、文字コードが矢印に変わってしまっています。 改行コード変換ソフトで変換して、また元に戻して作業をしました。 翌日、他の部屋のマシン(WinXP)でそのファイルを開いたら、また文字コードが矢印に変わっていました。 詳しいことはわからないレベルですが、状況だけ書いてみました。 文字コードが変わってしまうタイミングってあるのでしょうか。関係ないかもしれませんが、書籍についてきたサンプルファイルの文字コードはUTF-8なので、文字コード変換ソフトでShift_JISに変更しました(なぜShift_JISにしたかは、特に意味はありません。UTF8がいいというのは聞いていますが、とりあえずShift_JISでやっています)。 難しい理論は理解できないと思いますが、どうしてそうなるかを教えていただける方がいたらお願いします。