質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

187閲覧

Python/CGI: 入力された文字に応じて処理を変更するプログラムで、「く・ぐ」を含む文字のみ正しく処理されない

numin

総合スコア30

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2024/10/08 07:32

実現したいこと

入力された文字に応じて条件分岐を行い、その結果に応じて出力用配列に値を渡す。

前提

非常に無駄の多いプログラムかとは思いますが、入力された文書を1文字ずつ取得・文字に応じて処理を行うことでテキストを変換するというプログラムを作成しています。

処理の大部分は上手く動作しているのですが、何故か「く」が単体で渡された場合に限り条件分岐が正しく動作せず、直前の文字が2度渡されてしまっているようです。

※例: 「まもなく」の場合↠「まもなな」

たびたび申し訳ありませんが、原因・解決方法をご存じの方がいらっしゃいましたら、ご教示いただけますと幸いです。

発生している問題・エラーメッセージ

CGIを用いてブラウザに結果を出力した場合・h変数「original」に事前に文字列を設定してターミナル経由で実行した場合共にエラーメッセージは出力されませんが、「く」が単体で渡された場合には直前の文字が2度処理されてしまいます。

また入力された文書の1文字目が「く」であった場合には、ブラウザのページそのものが出力されませんでした。

なお、「く」と同じ出力結果を含む「ぐ」や「くぁ」などの場合には問題は発生しません。

該当のソースコード

Python

1#!/usr/local/bin/python3.7 2import cgi 3 4print("Content-Type: text/html; charset=utf-8") 5print() 6 7form = cgi.FieldStorage() 8original = form.getvalue("original") 9brl = [] 10i = 0 11 12while i < len(original): 13 l = original[i] 14 if l == 'く': 15 b == '⠩' 16 elif l == ' ' or(l == ' '): 17 b = '⠀' 18 # アルファベットの処理(省略) 19 elif l == 'あ': 20 b = '⠁' 21 elif l == 'い': 22 b = '⠃' 23 elif l == 'う': 24 b = '⠉' 25 elif l == 'え': 26 b = '⠋' 27 elif l == 'お': 28 b = '⠊' 29 elif l == 'ヴ' or(l == 'ゔ'): 30 b = '⠐⠉' 31 elif l == 'か': 32 b = '⠡' 33 elif l == 'き': 34 b = '⠣' 35 # もともと「く」の場合の処理が書いてあった箇所 36 elif l == 'け': 37 b = '⠫' 38 elif l == 'こ': 39 b = '⠪' 40 elif l == 'が': 41 b = '⠐⠡' 42 elif l == 'ぎ': 43 b = '⠐⠣' 44 elif l == 'ぐ': 45 b = '⠐⠩' 46 elif l == 'げ': 47 b = '⠐⠫' 48 elif l == 'ご': 49 b = '⠐⠪' 50 # さ行からわ行、記号、数字の場合の処理(省略) 51 # 小さいや・ゆがつく場合の処理(省略) 52 elif l == 'ょ': 53 if original[i-1] == 'き': 54 del brl[-1] 55 b = '⠈⠪' 56 elif original[i-1] == 'し': 57 del brl[-1] 58 b = '⠈⠺' 59 elif original[i-1] == 'ち': 60 del brl[-1] 61 b = '⠈⠞' 62 elif original[i-1] == 'に': 63 del brl[-1] 64 b = '⠈⠎' 65 elif original[i-1] == 'ひ': 66 del brl[-1] 67 b = '⠈⠮' 68 elif original[i-1] == 'み': 69 del brl[-1] 70 b = '⠈⠾' 71 elif original[i-1] == 'り': 72 del brl[-1] 73 b = '⠈⠚' 74 elif original[i-1] == 'ぎ': 75 del brl[-1] 76 b = '⠘⠪' 77 elif original[i-1] == 'じ': 78 del brl[-1] 79 b = '⠘⠺' 80 elif original[i-1] == 'ぢ': 81 del brl[-1] 82 b = '⠘⠞' 83 elif original[i-1] == 'び': 84 del brl[-1] 85 b = '⠘⠮' 86 elif original[i-1] == 'ぴ': 87 del brl[-1] 88 b = '⠨⠮' 89 elif l == 'ぃ': 90 if original[i-1] == 'き': 91 del brl[-1] 92 b = '⠈⠣' 93 elif original[i-1] == 'し': 94 del brl[-1] 95 b = '⠈⠳' 96 elif original[i-1] == 'て': 97 del brl[-1] 98 b = '⠈⠗' 99 elif original[i-1] == 'に': 100 del brl[-1] 101 b = '⠈⠇' 102 elif original[i-1] == 'ひ': 103 del brl[-1] 104 b = '⠈⠧' 105 elif original[i-1] == 'み': 106 del brl[-1] 107 b = '⠈⠷' 108 elif original[i-1] == 'り': 109 del brl[-1] 110 b = '⠈⠓' 111 elif original[i-1] == 'ぎ': 112 del brl[-1] 113 b = '⠘⠣' 114 elif original[i-1] == 'じ': 115 del brl[-1] 116 b = '⠘⠳' 117 elif original[i-1] == 'で': 118 del brl[-1] 119 b = '⠘⠗' 120 elif original[i-1] == 'び': 121 del brl[-1] 122 b = '⠘⠧' 123 elif original[i-1] == 'ぴ': 124 del brl[-1] 125 b = '⠨⠧' 126 elif original[i-1] == 'ヴ' or(l == 'ゔ'): 127 del brl[-1] 128 b = '⠲⠧' 129 elif original[i-1] == 'く': 130 del brl[-1] 131 b = '⠢⠣' 132 elif original[i-1] == 'ぐ': 133 del brl[-1] 134 b = '⠲⠣' 135 elif original[i-1] == 'つ': 136 del brl[-1] 137 b = '⠢⠗' 138 elif original[i-1] == 'づ': 139 del brl[-1] 140 b = '⠲⠗' 141 elif original[i-1] == 'ふ': 142 del brl[-1] 143 b = '⠢⠧' 144 else: 145 b = '⠈⠃' 146 elif l == 'ぇ': 147 if original[i-1] == 'き': 148 del brl[-1] 149 b = '⠈⠫' 150 elif original[i-1] == 'し': 151 del brl[-1] 152 b = '⠈⠻' 153 elif original[i-1] == 'ち': 154 del brl[-1] 155 b = '⠈⠟' 156 elif original[i-1] == 'に': 157 del brl[-1] 158 b = '⠈⠏' 159 elif original[i-1] == 'ひ': 160 del brl[-1] 161 b = '⠈⠯' 162 elif original[i-1] == 'み': 163 del brl[-1] 164 b = '⠈⠿' 165 elif original[i-1] == 'り': 166 del brl[-1] 167 b = '⠈⠛' 168 elif original[i-1] == 'ぎ': 169 del brl[-1] 170 b = '⠘⠫' 171 elif original[i-1] == 'じ': 172 del brl[-1] 173 b = '⠘⠻' 174 elif original[i-1] == 'ぢ': 175 del brl[-1] 176 b = '⠘⠟' 177 elif original[i-1] == 'び': 178 del brl[-1] 179 b = '⠘⠯' 180 elif original[i-1] == 'ぴ': 181 del brl[-1] 182 b = '⠨⠯' 183 elif original[i-1] == 'ヴ' or(l == 'ゔ'): 184 del brl[-1] 185 b = '⠲⠯' 186 elif original[i-1] == 'く': 187 del brl[-1] 188 b = '⠢⠫' 189 elif original[i-1] == 'ぐ': 190 del brl[-1] 191 b = '⠲⠫' 192 elif original[i-1] == 'つ': 193 del brl[-1] 194 b = '⠢⠟' 195 elif original[i-1] == 'づ': 196 del brl[-1] 197 b = '⠲⠟' 198 elif original[i-1] == 'ふ': 199 del brl[-1] 200 b = '⠢⠯' 201 else: 202 b = '⠈⠋' 203 elif l == 'ぁ': 204 if original[i-1] == 'ヴ' or(l == 'ゔ'): 205 del brl[-1] 206 b = '⠲⠥' 207 elif original[i-1] == 'く': 208 del brl[-1] 209 b = '⠢⠡' 210 elif original[i-1] == 'ぐ': 211 del brl[-1] 212 b = '⠲⠡' 213 elif original[i-1] == 'つ': 214 del brl[-1] 215 b = '⠢⠕' 216 elif original[i-1] == 'づ': 217 del brl[-1] 218 b = '⠲⠕' 219 elif original[i-1] == 'ふ': 220 del brl[-1] 221 b = '⠢⠥' 222 else: 223 b = '⠈⠁' 224 elif l == 'ぅ': 225 if original[i-1] == 'ヴ' or(l == 'ゔ'): 226 del brl[-1] 227 b = '⠲⠭' 228 elif original[i-1] == 'く': 229 del brl[-1] 230 b = '⠢⠩' 231 elif original[i-1] == 'ぐ': 232 del brl[-1] 233 b = '⠲⠩' 234 elif original[i-1] == 'つ': 235 del brl[-1] 236 b = '⠢⠝' 237 elif original[i-1] == 'づ': 238 del brl[-1] 239 b = '⠲⠝' 240 elif original[i-1] == 'ふ': 241 del brl[-1] 242 b = '⠢⠭' 243 else: 244 b = '⠈⠉' 245 elif l == 'ぉ': 246 if original[i-1] == 'ヴ' or(l == 'ゔ'): 247 del brl[-1] 248 b = '⠲⠮' 249 elif original[i-1] == 'く': 250 del brl[-1] 251 b = '⠢⠪' 252 elif original[i-1] == 'ぐ': 253 del brl[-1] 254 b = '⠲⠪' 255 elif original[i-1] == 'つ': 256 del brl[-1] 257 b = '⠢⠞' 258 elif original[i-1] == 'づ': 259 del brl[-1] 260 b = '⠲⠞' 261 elif original[i-1] == 'ふ': 262 del brl[-1] 263 b = '⠢⠮' 264 else: 265 b = '⠈⠊' 266 else: 267 b = l 268 brl.append(b) 269 i += 1 270 271message = ''.join(brl) 272tweet = message.splitlines() 273 274print(f'<!doctype html>\n<html lang="ja">\n<head>\n<meta charset="UTF-8">\n<meta name="viewport" content="width=device-width,initial-scale=1">\n<title>かんたん❕点字フォント君:結果</title>\n<meta name="twitter:card" content="summary_large_image" />\n<meta name="twitter:site" content="@naokiluca" />\n<meta name="twitter:title" content="かんたん❕点字フォント君" />\n<meta name="twitter:description" content="簡易的な点字フォント変換ページです。まだ対応しきれていない箇所もありますので、「使い方・注意点」を必ずお読みください。" />\n<meta name="twitter:image" content="https://naokiluca.com/brl/cgi-bin/brl.png" />\n<meta property="og:description" content="簡易的な点字フォント変換ページです。まだ対応しきれていない箇所もありますので、「使い方・注意点」を必ずお読みください。" />\n<meta property="og:title" content="かんたん❕点字フォント君" />\n<meta property="og:image" content="https://naokiluca.com/brl/cgi-bin/brl.png" />\n<meta property="og:url" content="https://naokiluca.com/brl/" />\n') 275print('<script type="text/javascript" src="https://naokiluca.com/jquery-3.6.0.min.js"></script>\n<script type="text/javascript">\n$(function(){\n$("#header-outer").load("https://naokiluca.com/header.html");  })\n</script>\n<script type="text/javascript">\n$(function(){\n$("#footer-outer").load("https://naokiluca.com/footer.html");  })\n</script>\n<link rel="stylesheet" href="brl.css" type="text/css" />\n</head>\n<body>\n<audio id="Btn" preload="auto">\n<source src="/audio/pon.mp3" type="audio/mp3">\n<source src="/audio/pon.wav" type="audio/wav">\n</audio>\n<header>\n<div id="header-outer" onclick="ring();">\n</div>\n</header>\n<main>\n<h1>かんたん❕点字フォント君</h1>\n<br><img id="titlepic" src="brl.png" width="320" height="240" alt="のイラスト">\n') 276print(f'<br>\n<h2>点字フォント変換結果✎</h2>\n<div>\n<textarea id="copy-target" value="{message}" minlength="5" maxlength=100" readonly>{message}</textarea>\n<br>\n<button type="button" id="copy-button">点字をコピー</button>\n') 277print(f'</div>\n<p><a href="https://twitter.com/intent/tweet?related=naokiluca&text=点字フォント君でテキストを点字に変換してみました!%0D%0A') 278for line in tweet: 279 print(f'{line}%0D%0A') 280print(f'さて、なんと書いてあるかな?%0D%0A%20%23かんたん点字フォント君%20by%20%23ラクセステック%20&url=https://naokiluca.com/brl/">ツイート(ポスト)する</a></p>\n<br>\n') 281print('</main>\n<footer id="footer-outer">\n</footer>\n') 282print('<script type="text/javascript">\nfunction ring() {\ndocument.getElementById("Btn").play();\n}\n</script>\n<script>\nconst copy_target = document.getElementById("copy-target")\nconst copy_button = document.getElementById("copy-button")\ncopy_button.addEventListener("click", function() {\ncopy_target.select();\ndocument.execCommand("copy");\ncopy_button.innerText = "コピー完了!";\n});\n</script>\n</body>\n</html>')

試したこと

  1. 渡された文字が「く」である場合の条件分岐を一番初めに移動する
  2. 直接「⠩」を出力させるのではなく数値文字参照の「⠩」を渡すよう変更
  3. 出力される文字そのものに問題があるのかもしれないと考え、「テスト」など全く異なる文字列が出力されるよう設定

などを試しましたが、どれも変化ありませんでした。

また「く」の出力結果と同じ文字を含む「ぐ」や「くぁ」などの場合には正しく処理されることから、出力時ではなく入力時の問題かと考えております。

補足情報(FW/ツールのバージョンなど)

Python3.7・Lolipopのレンタルサーバを使用中です。


以上です。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

15行目

b == '⠩'

b = '⠩'

の間違いですね

投稿2024/10/08 08:08

quickquip

総合スコア11209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

numin

2024/10/08 08:17

ありがとうございます、無事解決しました。 無駄に難しく考えてしまっていたようで、ケアレスミスのある状態でご質問してしまい失礼しました。 ベストアンサーに選ばせていただきますね。
quickquip

2024/10/08 08:32

こういうミスは思い込みが少ない他人の方がむしろ見つけやすい類の話で、なんの問題もないと思いますよ!
otn

2024/10/08 12:06 編集

確かにこれの自力での発見は難しい。今回たまたま先頭でしたが、途中だともっと。 ・「単純作業を繰り返し行うと、つい1つくらい間違いがち」という認識を持って単純作業部分を重点的にチェックする(単純作業のチェックを単純作業でやるのは大変だし見逃すのでプログラムやコマンドでやるといいです) ・単純作業の繰り返しをしない⇒今回だと "あ" "い"等をキーにした辞書型を使うとか。点字なので探せば出来合のデータがどこかにあるかも ・開発ツールに頼る⇒VSCodeにコピペしてみましたが、該当部分に 波下線 が付きました。ツールを探せば警告メッセージを出してくれる物もあるかと思います とはいえ、上記の1つ目と重なりますが、「単純ミスの発生をゼロにする事は出来ない」という認識を持てていれば「結果が期待通りでないという事は、どこかに単純ミスがあるのでは?」と思えたはずで、 「く」の処理周辺をよく見れば、自力での発見は十分可能と思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問