- ベストアンサー
文字集合範囲外の文字とパーセントエンコード
先日,以下の記事を読みました。 http://shimax.cocolog-nifty.com/search/2007/12/phphtmlspecialc_26bb.html で,以下のように書かれています。 >その際、サイト訪問者がEUCの補助漢字の大御所?「森鷗外」を入力したとします。すると、「鷗」の字は、「%26%2340407%3B」にURLエンコードされますから、それをデコードすれば、「鷗」になります。 これを当方環境で再現させることができないのです。 試しに, <?xml version="1.0" encoding="EUC-JP"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>SpecialChar TestCase 1</title> </head> <body> <p>ほげ</p> <form action="20071225-1.php" enctype="x-www-urlencode" method="post" accept-charset="UTF-8"> <p><input type="text" name="hoge" /></p> <p><input type="submit" name="fuga" /></p> </form> </body> </html> と書いたXHTMLのファイル(EUC-JP)と <?php $rawstring = $HTTP_RAW_POST_DATA; $queries = split("&",$rawstring); $queryhashtable = split("=",$queries[0]); header("Content-Type:text/plain;charset=UTF-8"); print($queryhashtable[0] . ":" . $queryhashtable[1]); ?> というファイル(UTF-8,だがBOMなしなのであまり関係ない)を作成し, XHTML側でhogeに対し鷗を入力し,送信したところ hoge:%E9%B7%97 となりました。 検証においては Windows XP SP3 RC1(v3264) Apache 2.2.6 PHP 6(200712250730) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b3pre) Gecko/2007122905 Minefield/3.0b3pre IE 7.0.5730.11 でいずれも同じ結果になりました。 URI自体を決めるのはブラウザ側だと思うのでPHPであることは全く関係がない気もしますが,何が違うんでしょう? #ブラウザの挙動がおかしいのであれば PHPを責めるべきではないと思う。 個人的にはこのほうがうれしい挙動ですが,気になっています。 #直接ブログにコメントしないのは, >どなたか、「&」を「&」に変換する意味を、実例を挙げて、しっかりと説明できる人おられますでしょうか? もし、おられたら、コメントをやさしいトーンでお願いします。 との内容からかけ離れているから聞きづらくて(汗 #accept-charset外したらMinefieldとIEに挙動の差が見られたが, #数値文字参照などにはなっていない
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (6)
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2281)
- sakusaker7
- ベストアンサー率62% (800/1280)
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2281)
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2281)
- sakusaker7
- ベストアンサー率62% (800/1280)
- sakusaker7
- ベストアンサー率62% (800/1280)
関連するQ&A
- 文字列の一部を取り出したいのですが、文字化けしてしまいます。
文字列の一部を取り出したいのですが、文字化けしてしまいます。 コードは以下のとおりです。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> </head> <body> <?php $str = "日本語日本語UTF-8"; print mb_substr($str, 0, 3); ?> </body> </html> おそらく2バイト文字の途中で切っているので文字化けするのだと思いますが、 対象方法が分かりません。 ご存知の方がいらっしゃいましたら、すみませんが教えてください。
- ベストアンサー
- PHP
- 文字コードについて
<?xml version="1.0" encoding="Shift_JIS" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja" id="sixapart-standard"> <head> <meta http-equiv="Content-Type" content="text/html" charset="Shift_JIS" /> </head> というように文字コード指定をしているのですが、なぜか文字コードがUTFになり、shift jisにすると文字化けしてしまいます。 どなたかアドバイスお願いいたします。
- ベストアンサー
- HTML
- XHTMLの文字コードのEUC-JPの文字化け
いつもはHTML4.01で作業をしていて XHTMLはどうも不慣れなせいか 今、外注が作成したHPを修正していて 文字コードをEUC-JPにどうしても変更しなければならないのですが それがうまくいかず、文字化けが発生してます。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> を <?xml version="1.0" encoding="euc-jp"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp" /> このように設定したら文字化けが発生しました。 どのように設定したら文字化けがなくなりますか?
- ベストアンサー
- その他([技術者向] コンピューター)
- 初歩的な質問で恐縮ですが、教えてください。
すみませんが、教えてください。 入力フォームでデータが送れなくて、困っています。 下のコードに問題点はあるのでしょうか? 自分では、分からないので、よろしくお願いいたします。 test1.php------------------- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> </head> <body> <form method="post" enctype="multipart/form-data" action="./test2.php"> <input type="text" name="fmTitle" ><br /> <input type="submit" value="次へ" > </form> </body> test2.php-------------------------- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> </head> <body> <?= $fmTitle . "<br />" ?> </body>
- ベストアンサー
- PHP
- なぜ文字化けしないのでしょうか?
Windows Me(shift_jis)とFedoraCore4(utf-8)のPCのブラウザに以下のFedoraCoreのPCに配置してあるgomi.php(utf-8で記載)を表示させて 入力欄に「お元気ですか。」と日本語を入れてもその応答が文字化けしません FC4はutf-8なのでshift_jisのWindows Meでは文字化けするはずですがしませんがどうしてでしょうか? gomi.php -------------------------------------------------------- <?php $in=isset($_POST['in'])?$_POST['in']:'bad'; echo '<?xml version="1.0" encoding="utf-8"?>'; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8"/> <title>test</title> </head><body> <p><?= $in ?></p> <form method="post" action="<?= $_SERVER['PHP_SELF'] ?>"> <input type="text" name="in"/> <input type="submit" value="送信"/> </form> </body></html>
- ベストアンサー
- PHP
- perl5.8のエンコードで悩んでます
perl5.8のエンコードで悩んでいます。 5.6環境下でjcodeなどを使用したいろいろな処理は普通にできるのですが、そろそろ5.8での文字処理もちゃんとできないとあぶないかなと思い、練習していましたが…なんとも挙動が解らないときがあります…。 よければご教授いただけると幸いです。 まず基本的な練習として、POSTされた文字データを受領するものを作ってみました。 <<送信元 post1.html>> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <p>POST実験</p> <form id="form1" method="get" action="post2.cgi"> <p>data1 <input name="data1" type="text" /> </p> <p>data2 <input name="data2" type="text" /> </p> <p> <input type="submit" name="button" value="送信" /> </p> </form> </body> </html> <<受領部 post2.cgi>> #!/usr/bin/perl #モジュール利用宣言 use CGI; #CGIモジュール use strict; #表記の正規化を強制 use warnings; #警告表示 use CGI::Carp qw(fatalsToBrowser); #エラー報告有効 #エンコーディングの指定 #use utf8; #この部分を有効にすると入力内容が文字化け #use encoding 'UTF-8';#これも同様に入力内容が文字化け #データの受領と変数名整理 my $input_data = new CGI; my $in_data1 = $input_data->param('data1'); my $in_data2 = $input_data->param('data2'); #入力チェック my $message_data = ""; #変数初期化 if($in_data1 eq "" && $in_data2 eq ""){$message_data = "入力部に空欄があります";} else{$message_data = 'Data1は'.$in_data1.'Data2は'.$in_data2.'です';} #ヘッダ発行 print "Content-type: text/html\n\n"; #html表示 print <<END_OF_HTML; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <p>サシスセソはSJISで化けるカタカナ。<br>入力内容は${message_data}</p> </body></html> END_OF_HTML exit; 両ファイルともTeraPadを利用して、文字コードはUTF-8N、改行はLFにしています。 しかし、use utf8;と書くと、入力文字が化けてしまいます。 (コメントアウトすると普通に表示されます) ちょっと漠然としていて申し訳ないのですが、なぜ化けるんでしょう…。 いろいろ調べてみたんですが、binmode STDOUT, ":encoding(utf-8)";とかをつけても特に変化がありません…。 しかし変わりすぎてキツい…でも今は5.8仕様の文字処理ができないとあぶないのかなぁ…。
- 締切済み
- Perl
- 文字エンコーディングについて
<?xml version="1.0" encoding="euc-jp"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html lang="ja" dir="ltr" xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" /> これは、私が使っているブログテンプレートのソースの最初の部分です。 このテンプレートに、 <script type="text/javascript" src="http://mcnv.net/bp/js/hitomojibp.js#tag_id=3270" charset="UTF-8"></script> のブログパーツって使えますか? プラグインにソースを貼ってみたんですけど表示されません。 原因は何なのでしょうか。 原因がわからないので、文字エンコーディングがおかしいのかな? と思っただけなので、違ったら指摘お願いします。
- ベストアンサー
- その他(インターネット・Webサービス)
- CakePHP文字化けについて
お世話になります。基本的な質問で申し訳ないのですが、CakePHPのインストールをしたのですが、ブラウザ経由の文字化けが発生しており、困っております。 \app\webrootに以下のHTMLファイルを設置し、ブラウザ経由でアクセスしたのですが、エンコードUTF-8でアクセスすると文字化けが発生してしまいます。エンコードをShift-JISに指定しなおしたところ問題なく表示されるのです。charset=utf-8を指定しているにも関わらず、Shift-JISで表示されるのはどうしてですか。また、UTF-8で正常に表示するには、追加で設定が必要になるのでしょうか。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>Hello</title> </head> <body> <p>これは、テストページです。</p> </body> </html>
- 締切済み
- PHP
- <title>~<title>部分にPHP読み込み
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" /> <meta name="keywords" content="" /> <meta name="description" content="" /> <title>●●●●●●</title> <meta http-equiv="content-script-type" content="text/javascript" /> </head> <body> ~ 上記<title>●●●●●●</title>部分の、●●●●●●にtitle.phpの内容を挿入したく、 <?php require("title.php"); ?> と記述したのですが、エラーが出てしまいます。 title.php単体では正常に文字が表示されます。 どのように記述したら良いか、どなたかご教授いただけないでしょうか。 宜しくお願い致します。
- ベストアンサー
- PHP
- XHTMLのIEでの表示
PHPを使ってXHTMLを出力しています。 下記のようなソースを使った場合、IE系ブラウザでXMLツリーが表示されてしまいます。IE8beta2、IE7、IE5で確認しています。 Google Chrome、Opera、FireFox 3ではこのような問題は起きていません。 どのようにすれば解決できるでしょうか。XML宣言を除けば一応表示はされたのですが。後方互換モードのことなどもIE7で改善されたとのことなので、混乱しています。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title></title> <body> </body> </html>
- 締切済み
- HTML
お礼
蛇足その1: 再現自体はできたので,解決していますが,気になったので。 >何も考えずに、慣例的に&を&に変換してましたが、、、orz 今回のように,補助漢字をIEで表示させる件は地道にやるしかないかもしれませんが,個人的には,あまり手作業でやることを好みません。 ========以下,ほぼ自分のBlogのQ3480604の内容の繰り返し======= http://oshiete1.goo.ne.jp/qa3480604.html のsuzuki-_-さんのケースでは, &を実体参照にしそこねてますが,それはさておき, innerHTMLを用いています。 ソースコードがShift_JISで書かれていたら Shift_JISの文字集合外の文字を入力し,送信された場合に正しく表示されません。ソースコードがShift_JISでも数値文字参照等を用いて Unicode文字集合内の文字を表示できることから考えても好ましくは思いません。 標準にないinnerTextを使うことを嫌って 「textContentがなければ」という条件文をつけてはいますが, 私の書き方であれば,そのような文字が入力されても表示できます。 #innerTextでは文字列を渡せば改行が反映されますが,textContentではwhite-space:preがないと改行やらは入力通りにならない #suzuki-_-さんのコードとの違いの一つとして 「連続する半角空白などの空白文字類もレンダリングされるため, 教えて!gooのようにソースコードのインデントが消滅したりしない」というのもあります。 #まぁ今思えばtextContentでなく,出力先のノードのchildNodesを removeChildで全て取り除いて,document.createTextNodeしてappendChildすれば もっと短くなっただろうとは思うのだけれど。 ====================================== http://shimax.cocolog-nifty.com/search/2007/12/phphtmlspecialc_26bb.html >ただ、ここで不思議なのは、「©」を入力したユーザーが本当に確認画面で「©」ではなくて、(略) RLOに関する検討を十分にしていませんが, 基本的に私個人は©とそのまま表示されることを支持します。 私がQ3480604で掲示したコードもその通り動くはずです。
補足
php.iniについて テキストエディタでUTF-8をEUC-JPに全て置換しても再現できず。うーむ。