tattyan3
@tattyan3 (tatsuji shimo)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Python localhost 200 エラー文字化け

解決したいこと

500 エラーはでなくした。

例)
python で、とりあえずフォームを表示したい。
解決方法を教えて下さい。

発生している問題・文字化け

または、問題・エラーが起きている画像をここにドラッグアンドドロップ
2023-12-01 (3).png
2023-12-01 (4).png
2023-12-01 (5).png
2023-12-01 (6).png

該当するソースコード

#!C:/Anaconda/python

print ('Content-type:text/html'+'\n'+'\n')

print ('<!DOCTYPE html><html lang="ja"><head><meta charset="UTF-8"><title></title></head><BODY BGCOLOR="#ffffff"><h1>test decoder</h1>'+'\n')
print ('ここまで来た。'+'\n')
#decode()
#def decode():
in_d = {
    'apple': 100,
    'banana': 150,
    'cherry': 200
}
print ('ここまで来た。'+'\n')
print ('りんごは'+{in_d['apple']}+'円<br>'+'\n')
in_d['apple'] = 110
print ('支払いりんごは'+{in_d['apple']}+'円<br>'+'\n')
#return

#form()


#def form():
print ('ここまで来た。'+'\n')
#print (日本語テスト<br>ENV 'SCRIPT_NAME' <br>\n);

print ('<form action="http://127.0.0.1/my_python/python_test.cgi" method="POST">'+'\n')
print ('<table border=0 cellspacing=1>'+'\n')
print ('<tr><td><b>name</b></td><td><input type=text name=name size=28 value="'+{in_d['name']}+'" maxlength="12" class=f></td></tr>'+'\n')
print ('<tr><td><b>email</b></td><td><input type=text name=email size=28 value="'+{in_d['email']}+'" maxlength="36" class=f></td></tr>'+'\n')
print ('<tr><td><b>submit</b></td><td><input type=text name=subm size=36 value="'+{in_d['subm']}+'" maxlength="36"class=f></td></tr>'+'\n')
print ('<tr><td colspan=2><b>comment</b><br><textarea cols=70 rows=7 name=comment wrap="soft" class=f>'+{in_d['comment']}+'</textarea></td></tr>'+'\n')
print ('<tr><td><b>url</b></td><td><input type=text size=52 name=url value="'+{in_d['url']}+'" maxlength="60" class=f></td></tr>'+'\n')
print ('<tr><td><b>password</b></td><td><input type=password size=28 name=password value="'+{in_d['password']}+'" maxlength="12" class=f></td></tr>'+'\n')
print ('<tr><td><input type=submit value="submit"></td><td><input type=reset value="reset"></td></tr>'+'\n')
print ('</form></table><br>'+'\n')

print ('name='+{in_d['name']}+'<br>'+{come}+'<br>It OK?<br>'+'\n')
# print()内に改行してはいけない(テキスト的に) html <!-- -->コメントを入れてはいけない {}の文字として書き出しには\{\}としなければならない ''を使ってはならない\'\' \nと次の先頭をくつけてはならない。
# \n をやると、終わらねばならない。print は機能が高すぎる。

#return


# 辞書のキーと値をループで処理 forの範囲は?
for my_key, my_valu in in_d.items():
    (print ({my_key}+' は: '+{in_d[my_valu]}+'<br>'+'\n'))
print ('</body></html>'+'\n')
exit()

自分で試したこと

エンコードとデコードの確認。ファイル。エッジの開発者ツールで確認。途中までしか出てこない。

0

3Answer

最初の文字化け画面を見ただけの想像ですが・・・

問題の文字 "�" は、たぶん、Unicode デコーダーではデコードできないシーケンスが REPLACEMENT_CHARACTER (U+FFFD) に置き換えられたものだと思います。

文字コードの不整合で、例えば、ソースが Shift_JIS で書いてあるが、処理系は UTF-8 を期待していて、結果デコードできず "�" に置き換えられたという話をよく聞きます。

実際の例としては:

React で日本語を使うとコンパイルエラー / 文字化け
http://surferonwww.info/BlogEngine/post/2022/04/10/use-of-japanese-characters-in-react-causes-complie-error.aspx

ASP.NET Core で文字化け
http://surferonwww.info/BlogEngine/post/2017/06/16/decoding-problem-caused-by-view-created-by-scaffolding-in-aspnet-core-project.aspx

文字コードに不整合がないかチェックしてはいかがですか?

1Like

元ファイルはUTF-8(BOM無し)でテラパッド、N-noto++の二つのテキストエディタで確認。
pythonの中に入ってデコードして何かになって
edge(web browser)にutf-8として、扱えとテキスト明記してあって、その通り扱って、文字化けしています。

なっているのではないか、と、解釈したのですが、中に入って何をしているかは、分りません。
どうもありがとうございます。参考までに他の言語「Ruby」「Perl」「html」は同構文を正しく出力します。

0Like

Comments

  1. @tattyan3

    Questioner

    ''''参考(perl)
    action="$ENV{'SCRIPT_NAME'}"
    print 'action="'+{ENV['SCRIPT_NAME']}+'" method=....'+'\n'
    となるのではないかと、今ならおもうが。。。
    ''''

  2. 質問者さんは回答欄に書かないで、回答者の回答に対するコメントなら当該回答欄の下のコメント欄に書くか、質問内容に関する追加情報なら質問欄を編集して書くようお願いします。回答と質問がごっちゃになって訳が分からなくなりますので。

    そうしてもらって、この回答は削除していただくようお願いします。

    中に入って意味の分からんのにするから、英文以外が解釈不能になり、連鎖して、間違いはないのだが「200」だと。。。

    HTTP 200 応答が返ってきたのだから文字化けするようなことはないはずと言ってますか?

    REPLACEMENT_CHARACTER に置き換えられているということから、処理の際に文字化けで例外がスローされることはないように思います。であれば、200 応答が返ってきても不思議はないです。

  3. @tattyan3

    Questioner

    ''''''これからやろうとしているbuf取り込みと処理perlの参考資料
    if ($ENV{'REQUEST_METHOD'} eq "POST") {
    $post_flag=1;
    if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます"); }
    read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
    } else {
    $post_flag=0;
    $buf = $ENV{'QUERY_STRING'};
    if($buf > 3){print "GETは受け付けていません。";} #GET受付
    }

    print "ここはきたよ$buf
    \n";
    foreach ( split(/&/, $buf) ) {
    ($key, $val) = split(/=/);
    $key =~ s/\0//g;
    $key =~ s/"/"/g; #koko20131029
    $key =~ s/</</g;
    $key =~ s/>/>/g;
    if(!($kye eq '' || $kye eq 'name' || $kye eq 'email' || $kye eq 'subm' || $kye eq 'comment' || $kye eq 'url' || $kye eq 'password')){
    print "this cgi not request.
    \n"; #動かんのかな?
    }
    if($key =~ m/;/){$val = "";&error("エラー・GET
    戻る");}
    $val =~ tr/+/ /;
    $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;
    # エスケープ
    $val =~ s/\0//g;
    $val =~ s/&/&/g;
    # $val =~ s/&#/&#/g;
    $val =~ s/"/"/g;
    $val =~ s/</</g;
    $val =~ s/>/>/g;
    # $val =~ s/\r\n/
    /g;
    # $val =~ s/\r/
    /g;
    # $val =~ s/\n/
    /g;
    # $val =~ s/[\x00-\x20]+/ /g;
    if($key eq 'mode' && $val eq 'admin'){
    $ouna_kensa = 1;
    $autolink = 1;
    }elsif($key eq 'url' && $val !~ m/^<a./ ){
    #この項目は何もしない
    }else{
    if ($val =~ m/https?:[\w.~-/?&+=:()@%;#%]+/){
    $val =~ s/https?:[\w.~-/?&+=:()@%;#%]+/URLは、禁止されました。<\/b>/g; #ノーテスト
    $url_kensa = 1;
    }
    #&error("URLは、禁止されました。");}
    }
    ちなみに
    $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;
    は、別の書き方もあったはずです。jcode.plなんて使わなくても良いですよ。
    ''''''''''

  4. @tattyan3

    Questioner

    $key =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;

Comments

  1. @tattyan3

    Questioner

    もろ、関係してます。しかし、俺のpythonは x utf8 ? を受付ないから、環境変えたってやれないって、問題が。

  2. 受け付けないとはどういうことですか?
    環境とは何のことですか?
    もう少しちゃんと文章書いてもらえないでしょうか?

    また動作環境やバージョン等ももう少し詳細に記載してください。

  3. @tattyan3

    Questioner

    解決しました。python3_12.zipの最新版をダウンロードしてpython3フォルダーに展開して、中のzipも一応展開、環境変数は、分らないので、パスは通していませんが。
    '''''''
    #!C:/Python3/python_3_12_0_embed_amd64/python -X utf8

    coding=utf-8

    '''''''
    解説すると、分るようにython.exeを配置して、呼び出し時にコマンド「 -X utf8」を実行させる。
    念のために動いたシステムに最初の命令として「# coding=utf-8」を実行させる。
    です。
    2023-12-06.png
    の様に、日本語を表示するようになります。

Your answer might help someone💌