実現したいこと
入力された文字に応じて条件分岐を行い、その結果に応じて出力用配列に値を渡す。
前提
非常に無駄の多いプログラムかとは思いますが、入力された文書を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>')
試したこと
- 渡された文字が「く」である場合の条件分岐を一番初めに移動する
- 直接「⠩」を出力させるのではなく数値文字参照の「⠩」を渡すよう変更
- 出力される文字そのものに問題があるのかもしれないと考え、「テスト」など全く異なる文字列が出力されるよう設定
などを試しましたが、どれも変化ありませんでした。
また「く」の出力結果と同じ文字を含む「ぐ」や「くぁ」などの場合には正しく処理されることから、出力時ではなく入力時の問題かと考えております。
補足情報(FW/ツールのバージョンなど)
Python3.7・Lolipopのレンタルサーバを使用中です。
以上です。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/10/08 08:17
2024/10/08 08:32
2024/10/08 12:06 編集