• ベストアンサー

JavaScriptの文字のエンコードについて

フォームの入力欄で、「'」(シングルクォート)を入力してサブミットすると、ブラウザ(Firefox3.5)で見ると「'」と表示されていますが、ブラウザのソースを見るとvalueの¥ところには、「'」と表示されています。 これは、PHPでエンコードされているせいなのですが、 PHPでエンコードされた「'」を、JavaScriptを使って、ブラウザからソースを見たときに「'」と表示できるでしょうか? ソースは、こんな感じで書いたのですが、動作しませんでした........。 function chChar(){ var keyValue = document.getElementById("delete_key").value; var ascii = new Array(' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F','G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~'); var htmlChar = new Array(' ', '!', '"', '#', '$', '%', '&', ''', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~'); var re = new RegExp(htmlChar); if(keyValue.match(re)){ for(i=0; i<ascii.length; i++){ keyValue = keyValue.replace(htmlChar[i], ascii[i]); } } return keyValue; }

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

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

> var re = new RegExp(htmlChar); 動かないのはRegExpに配列を指定しているからですね。 「いずれか」にヒットさせたい場合、通常は | で区切った文字列にします。 /&#(32|33|34|35|36);/ 数値参照を実態に変更するにはString.fromCharCode()が使えます。 ほとんど書き換えてしまいましたが、こんな感じでどうでしょうか。 var re=new RegExp(/&#(\d+);/); while(keyValue.match(re))  keyValue=keyValue.replace(re, String.fromCharCode(RegExp.$1)); &lt;などの実態参照は、変換テーブルを使わなければなりません。 考え方は質問文で作られたものと同じですので、 変換テーブルを作り直して、if文を消せば行けると思います。

stylehorse
質問者

お礼

ありがとうございました。 第一段階として、うまく動作することができました。 大変、お世話になりました。

その他の回答 (1)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

(1)if (keyValue.match(re))  matchメソッドはnullか一致したMatchコレクションを返します。  if文はtrue/falseで判断するので、正しく動作しません。 (2)keyValue.replace(htmlChar[i], ascii[i]);  同じ特殊文字が複数ある場合は最初に見つかった方の文字列しか  変換されません。 正規表現で"&#\d+;"を検索し、この一致(Matchオブジェクト)から 数値部分を取得します。数値から文字を生成(fromCharCode)し、 一致パターンの部分を置き換えるべきでは?

stylehorse
質問者

お礼

丁寧にご指摘いただきありがとうございました。 非常に参考になりました。

関連するQ&A