• ベストアンサー

$_GETで2バイト文字列を取得することは可能?

2バイトで作成されたフォルダ名(漢字やひらがななど)を、 ブラウザにツリー表示して、それがクリックされた時に クリックされたフォルダ名を取得して、 ブラウザがそのフォルダ先を参照し、 フォルダ中のファイル名をブラウザ上に表示できるようにしています。 $_GETを用いて、フォルダ名を取得しているのですが、 2バイトのフォルダ名だと、中身がどうやらバケています。 フォルダ名が英数半角の時は、上手く処理されるのですが、 漢字やひらがななどの2バイトのフォルダ名だと、 どうしても上手くいきません。 エンコードのurlencode()関数やデコードのurldecode()関数 を用いて、いろいろやってみましたが、上手く変換してくれません。 URLと違って、パス名、フォルダ名なので、2バイトだとそもそも $_GETで取得すること自体が無理なのでしょうか? どなたか詳しい方、ご教授いただけると幸いです。 よろしくお願い致します。

  • THUBAN
  • お礼率76% (771/1002)
  • PHP
  • 回答数12
  • ありがとう数14

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.11

#10> ウチの環境の場合 function uuee(uu) { return(escape(uu).replace(/\+/g,"%2b")); } で 新しいフォルダを変換した場合 /%u65B0%u3057%u3044%u30D5%u30A9%u30EB%u30C0 になります。 これが、 %u3057%u3044の部分(しい)が %u30FBmicro;%u30FBcent; になるのは、 「しい」がSJISで82B582A2になるので、 82:わかんない文字→ナカグロ B5:μ(マイクロ)→µ 82:わかんない文字→ナカグロ A2:¢(セント)→¢ の様な感じで変換されているようです。 それで、なんで'&'がなくなっているのかもよくわかりませんが なんか変な処理してませんか? magic_quotes は、とりあえず関係なさそうですけど・

THUBAN
質問者

お礼

自己解決いたしました! 原因は、やはりフォルダ名を渡す時点で、バケていたようです。 htmlentities()を用いて、渡していたのですが、 第三番目の引数を指定せずに渡していたので、 ISO-8859-1 文字セットがデフォルトの文字エンコーディングとして使用されました。 第三番目の引数に、"SJIS"を指定して、 $_GETで取得した値を、教えていただいたソース「すごくちからわざ(php4版)」を 使用させていただき変換させてみたところ、 全角ひらがな、全角カタカナ、漢字のフォルダ名については、 正常な値となり、認識しました。 (ただ、半角カタカナは、まだダメみたいですが…) <参考:htmlentities()> http://php.s3.to/man/function.htmlentities.html 長々とお付き合いくださって、本当にどうもありがとうざいました。 根本原因にたどり着くまで、非常に助かり、 また、「すごくちからわざ(php4版)」も、とてもありがたいコードと なりました。 どうも、ありがとうございました!m(__)m

THUBAN
質問者

補足

長くお付き合いいただき、本当にすいません。恐縮です。m(__)m 抜粋なので、これでおわかりになるかどうかわかりませんが、 さらにソースの一部を付け加えて書きます。 <SCRIPT> parent.lsctl.oroot.valor="root=['','','','',0,'','m0',0,0,[ ['/','javascript:mmexec(\"/\")','','',0,'','',0,0,['%%','/']] ]]"; eval(parent.lsctl.oroot.valor); parent.lsctl.oroot.treedeep=0; parent.lsctl.oroot.treeleaves=0; parent.lsctl.oroot.treeheavy=0; heavy=parent.lsctl.oroot.treeheavy; </SCRIPT> function uuee(uu) { return(escape(uu).replace(/\+/g,"%2b")); } function mmexec(s) { parent.lstop.location.href='hoge.php?aaa='+uuee(s); return true; } -------- <SCRIPT></SCRIPT>の部分は実際は呼び出していて、 ちょっと複雑なので、取りあえず、走らせた後、 ブラウザのソース表示で表示させたままのをコピペしました。 -------- では、function uuee(uu)のescape処理に間違いなさそうで、 問題は、function mmexec(s)に渡している値が おかしいかも??という感じでしょうか?

その他の回答 (11)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.12

>半角カタカナは、まだダメみたいですが >htmlentities()を用いて、渡していたのですが、 フォルダ名を埋め込む部分にhtmlentities って必要なんですか?

THUBAN
質問者

お礼

ソースを追っていてたどり着いたところが、 htmlentities だったんです。 何故、必要だったのかは・・・?? すいません、別のデバッグ続きで覚えてないです。 m(__)m

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.10

>これは、何がおかしいのでしょう? %u{16進4桁} は、16進4桁がユニコードの文字コードを表しています。 そのつもりで、変換する手順なんですが、 30FB は、(文字パレットなんかで確認して貰えると判ると思いますが) ・(ナカグロ)です。 その前の段階で、文字コードとして無い文字を割り当てようとしたので、ナカグロが割り当てられたのかもしれません。 ところで、その元のパス名はなんだったのでしょうか?

THUBAN
質問者

補足

フォルダ名は /新しいフォルダ です。 その上は、ルート(実際のHDDドライブのルートではなくて、 データ格納先としてプログラム内で指定した仮想ルート)です。 つまり、ルートのすぐ下に、/新しいフォルダ としてフォルダを作成し、それをブラウザに表示させて、 そのフォルダ名をクリックすると、そのフォルダ名に移る という具合にしたいわけです。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.9

>PHP4なのです。 PHP5なのは、foreach の &$value の部分なので foeach { } の部分を foreach ($array as $index => $value){ if($value[0] != '%'){ $conv=""; for($i=0;$i<strlen($value);$i++){ $conv .= sprintf("%%u%04X",ord($value[$i])); } $array[$index]=$conv; } } に置き換えれば良いと思います。

THUBAN
質問者

補足

現在のプログラム内の $_GET で取得した中身を表示させ確認したところ、 /%u65B0%u30FBmicro;%u30FBcent;%u30D5%u30A9%u30EB%u30C0 となっていましたので、 教えていただいたソース「すごくちからわざ(php4)」)を使用させていただき 変換させてみたところ、 /新・micro;・cent;フォルダ となって表示され、正常にデコードできませんでした。 これは、何がおかしいのでしょう? お手数おかけしますが、もし、おわかりになりましたら、 ご教授下さいませ。m(__)m <ちなみに抜粋的となりますが、以下、当方のソースを書き出しておきます> <?php $aaa=$_GET["aaa"]; ?> var aaa='<?=addslashes($aaa)?>'; function uuee(uu) { return(escape(uu).replace(/\+/g,"%2b")); } ↓そしてこのような感じでjavascriptで実行させています。 ・・・href='hoge.php?aaa='+uuee(aaa)+'・・・・;

  • gama001
  • ベストアンサー率50% (3/6)
回答No.8

「サーバー側でurlencodeしたものでリンクを生成する」について 以前の内容を見るとEUCで統一されているようなので こんな感じかと 【test.php】 <?php if ( isset( $_GET['next'] ) ) echo $_GET['next']."<br>"; $fname = 'XYZ新しいフォルダ'; echo "<A href='test.php?next=".urlencode($fname)."'>$fname</A>"; ?> #もしかしたらこういう話ではないのかなぁという気がしてきましたが どうでしょうか?

THUBAN
質問者

補足

ありがとうございます。 問題は、どうやらANo.5さんがご回答くださったように、フォルダ名をクリックした後、javascriptが走り、javascriptのencode()でエンコードしているので、PHPでデコードしても正しく戻らず文字化けしているらしいんです。 文字コードについては詳しくないので、皆さんからいただいた内容で試したり思考錯誤中です・・

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.7

すごくちからわざ(php5) <?php $str="/%u65B0microcent%u30D5%u30A9%u30EB%u30C0"; $array=preg_split("/(%u[0-9A-Fa-f]{4})/", $str, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE); foreach ($array as &$value){ if($value[0] != '%'){ $conv=""; for($i=0;$i<strlen($value);$i++){ $conv .= sprintf("%%u%04X",ord($value[$i])); } $value=$conv; } } $str = join("", $array); $str = preg_replace("/%u([0-9A-F]{2})([0-9A-F]{2})/ei","chr(hexdec('$1')).chr(hexdec('$2'))",$str); $str = mb_convert_encoding($str,"sjis","unicode"); print $str; ?>

THUBAN
質問者

補足

残念ながら、用いているのはPHP4なのです。 サーバー環境の変更できなくもないですが、さすがにPHPヴァージョンを変えることを依頼するのは無理そうです。 上記のコードをPHP4で使えるように記述し直し用いることは可能でしょうか? <参考までに> サーバ環境:Windows2003Server、IIS、PHP4.4.2 開発クライアント環境:WindowsXPpro、Apache2.0.55、PHP4.4.2

  • gama001
  • ベストアンサー率50% (3/6)
回答No.6

どうしてもクライアント側で エンコードしなくてはならない理由があるなら まずjavaScript側で encodeURIComponentを使ってエンコードしておく。 php.iniは mbstring.encoding_translation = Off の設定にしておいて $_GETで受けたデータをrowurldecodeして 更にUTF-8から内部コードにmb_convert_encodingしてやると 正しく動作しそうです。 いろいろ事情があるでしょうが サーバー側でurlencodeしたものでリンクを 生成したほうが簡単だと思いますよ^^

THUBAN
質問者

補足

ありがとうございます。 サーバーはレンタルサーバーではないので、 ある程度、希望どおりに環境は変更してもらえます。 「サーバー側でurlencodeしたものでリンクを生成する」とは、 具体的にどういったものでしょうか? ご教授いただけると幸いです。

  • taskuni
  • ベストアンサー率71% (49/69)
回答No.5

化けてるのではなく、JavaScriptでエンコードしているのでは?

参考URL:
http://ns1.php.gr.jp/pipermail/php-users/2003-April/015213.html
THUBAN
質問者

お礼

<補足追加させて下さい> いただいたURLの、escape、unescapeを参考に $_GET()内のバケ文字を変換してテスト表示してみたところ、 カタカナと半角カタカナのフォルダ名は、 問題なく戻すことができました。 しかし、ひらがなは余計にバケてしまい、漢字も一部戻りますが、 やはりバケる部分があるので、このままだと使えず・・ このあたりの原因は何なのか、もしおわかりになるようでしたら ご教授下さいませ。 すでに、ブラウザ表示させたフォルダ名を、マウスクリックで JavaScriptを走らせている箇所を多く作りこんでいるので、 今からJavaScriptをやめるのは、ちょっと大変なのです。 半角英数のフォルダでテストしながらほとんど作成してしまったので、 後になって、2バイトフォルダ名がこのようになってしまうとは、 気がつかず・・・うかつでした。m(__)m

THUBAN
質問者

補足

そのとおりです! ブラウザ表示されたフォルダ名をクリックすると JavaScriptでの処理に走ります。 以下の方たちに、補足したかったのですが、 ソースが複雑になっているので、掲示板では ちょっと説明しきれず、思案していたところです。 参考URLはまだじっくり見ておりませんが、 早速、拝見させていただきます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

普通は、そんなことが面倒なので、URL直接指定 では2バイト系の文字の受渡しはしません。 ユーザーが任意に入力した文字を引数にしたいなら formを使って正規の手段で渡せばすみます。 そうでないなら、任意のidなどで管理するのが 確実です。構造を考え直してはいかがでしょうか?

  • gama001
  • ベストアンサー率50% (3/6)
回答No.3

そもそものフォルダリンクを出力している部分はどうなっているのでしょう? (そこが間違ってると後でいくらいじっても変になるだけ) あと出力している画面はEUCですか? SJISの場合 mbstring.encoding_translation = Off とされてますから自分でそれなりの処理をしてますか? 私はあまり文字コードに長けていないので 記載された化け方を見てもぴんと来ません。 >どなたかピンときませんか?

  • gama001
  • ベストアンサー率50% (3/6)
回答No.2

$_GETで取得ということはもしかして <A href="xxx.php?name=日本語フォルダ名"> ということでしょうか。 だとしたら先にこのリンクを表示する時点で urlencodeしておかなければいけません。 あとはphp.iniのマルチバイト関連の設定を見直す。

THUBAN
質問者

補足

試行錯誤してみていますが、どうも上手く行きません。 もし、おわかりになるようであれば、ご教授下さいませ。m(__)m ブラウザに表示させてあるフォルダ名をクリックしたときに、 xxx.php?name=/%u65B0%u30FBmicro;%u30FBcent;%u30D5%u30A9%u30EB%u30C0 のような感じで送信されているようで、$_GETで取得しても、 バケてしまって、正しいフォルダ先に飛んでくれないのです。 例えば、  新しいフォルダ という名称のフォルダだと、 /%u65B0%u30FBmicro;%u30FBcent;%u30D5%u30A9%u30EB%u30C0 のようにバケます。 (一番最初の'/'はaddslashesでバックスラッシュを挿入しています) また、  XYZ新しいフォルダ という名称のフォルダだと、 /XYZ%u65B0%u30FBmicro;%u30FBcent;%u30D5%u30A9%u30EB%u30C0 のように、最初の半角英字(XYZ)は正しく取得されますが、 その後の2バイト文字は、同様にバケます。 以下、php.iniの関連しそうなところの設定を抜き出してみました。 [mbstring] ; language for internal character representation. mbstring.language = Japanese ; internal/script encoding. ; Some encoding cannot work as internal encoding. ; (e.g. SJIS, BIG5, ISO-2022-*) mbstring.internal_encoding = EUC-JP ;mbstring.internal_encoding = SJIS ; http input encoding. ;mbstring.http_input = auto mbstring.http_input = ASCII,JIS,EUC-JP,SJIS ; http output encoding. mb_output_handler must be ; registered as output buffer to function ;mbstring.http_output = SJIS mbstring.http_output = EUC-JP ; enable automatic encoding translation according to ; mbstring.internal_encoding setting. Input chars are ; converted to internal encoding by setting this to On. ; Note: Do _not_ use automatic encoding translation for ; portable libs/applications. mbstring.encoding_translation = Off ;mbstring.encoding_translation = On ; automatic encoding detection order. ; auto means ;mbstring.detect_order = auto mbstring.detect_order = ASCII,JIS,EUC-JP,SJIS ; substitute_character used when character cannot be converted ; one from another mbstring.substitute_character = none;

関連するQ&A

  • 半角文字と全角文字のencodeのちがい

    お世話になります。 Linux JSP-Servletにて開発を行っているのですが。 JSPにて、半角の「ア」と全角の「あ」をURLEncoder.encodeでエンコードし、Servletに送信し、 Servlet内でURLDecoder.decodeでデコードしようとしているのですが、半角の「ア」はうまくencode,decodeされている(デバッグで出力すると「ア」と表示されている)のですが、全角の「あ」はうまくdecodeして「あ」と出力されません、URLEncode、URLDecodeは全角文字では使用できないのでしょうか? Linuxにて全角日本語を扱うときの方法について ご存知のかたよろしくお願いします。

    • ベストアンサー
    • Java
  • エンコードされたものを、$_GETしたら...

    よろしくお願いします。グーグルdirectory検索のパラメータ%E3%82%A2%E3%83%BC%E3%83%88を使ったWEBアプリを作ろうと思っています。 $query ='%E3%82%A2%E3%83%BC%E3%83%88/' ; //これは'アート/'ディレクトリに対応している print '<a href="'.$_SERVER['PHP_SELF'].'?query='.$query.'">アート</a>'; のリンクをブラウザで実行して、$_GET['query']して、$queryに代入してprintしたところ、'アート/'と表示されました。 '%E3%82%A2%E3%83%BC%E3%83%88/'を何度も持ち歩きたいと思っているので、'アート/'となってもらっては困るのです。なぜなら、この$query ='アート/'を次に$_GETで受け取ると、 'アーチE'と表示されたからです。 '%E3%82%A2%E3%83%BC%E3%83%88/'のまま <a href="'.$_SERVER['PHP_SELF'].'?query='.$query.'">アート</a>で、 次に渡して、$_GET['query']で受取る方法はないでしょうか? または、'%E3%82%A2%E3%83%BC%E3%83%88'をデコードして'アート'にする関数などありますか?  urlencode('アート');は、'%83A%81%5B%83g'という少し短いものになり、これは使うことができないのです。

    • ベストアンサー
    • PHP
  • エクセルシートの文字列加工について

    エクセルのシートのA列に"全角ひらがな漢字"の文字列と"半角英数"の文字列を含むセルが縦に並んでいます。約200行。 ■この中から、"全角ひらがな漢字"の文字列を右となりのB列に、"半角英数"の文字列をさらに右となりのC列に、それぞれコピーしたいのですが、関数・マクロなどでいい方法がありましたら教えて下さい。 ■それから、半角英数文字列のC列から、""で囲まれた文字列のみをさらにD列にコピーしたいのです。 文字列の長さが統一されていれば、比較的簡単なのですが、今回は文字列の長さが不規則です。よろしくお願いします。

  • 文字数を取得したい

    漢字を含んだ文字列の文字数を取得したのですがうまくいきません。 どなたか教えてください。 例: 「asetg漢字」という文字列だったら、7文字として取得したい。 上記の例で、lstrlenや、MFCの関数(String)で文字数の取得を試みたのですが、バイト数で取得してしまうため、うまくいきませんでした。

  • PHPからjavascriptへGETで値を渡すとき

    初歩的な質問で失礼いたします。 PHPからjavascriptへGETで値を渡すときにマルチバイト文字が文字化けしてしまいます。 javascriptのjQueryというライブラリを利用しています。 具体的には、 -------------- test.js -------------- var url = 'test.php?code=' + code; $.get(url, function(data){ alert(data); } -------------------------------------- --------------- test.php ------------- $input = $_GET['code'];  ・・・mysqlの処理・・・ echo $output; --------------------------------------- という処理をしています。 test.js → test.phpへ渡す値はマルチバイトではないので問題ないのですが、 test.php → test.jsへ返す値はマルチバイトで文字化けしてしまいます。 php側でrawurlencode関数でエンコードしてから、javascript側でdecodeURI関数を使用してデコードしたのですが、うまくデコードできませんでした。 恐らくデコードの仕方が悪いんだと思うんですが。。。 分かりにくい説明で恐縮ではございますが、ご回答をお願いいたします。 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • htmlspecialchars()について

    htmlspecialchars()関数で、クエリー文字列をHTMLエンティティーに変換してるはずなのですが、中身をダンプしたり、ジャンプしたページのクエリーを見ても、変換されておらず、生の 引数が表示されています。どうすれば、%2ケタなどの文字列で表示されるのか、ご指導お願い致します。スクリプトは下記のようなものです。なお、encoder.php, decoder.php は、両方UTF-8でエンコードしたスクリプトです。 --------------------------------------------------------------------------------------------------------- ジャンプ元:[encoder.php] <!doctype html> <html> <head><title>URLエンコード</title> <meta charset="UTF-8"> </head> <body> <br><br> <center> <?php $input = "空条"; $from = 1; $input2 = urlencode($input); $from2 = urlencode($from); $query_string = 'name='.$input2.'&from='.$from2; echo '<a href="decoder.php?'.htmlspecialchars($query_string, ENT_QUOTES, 'UTF-8').'">エンコード</a>'; ?> </center> </body> </html> -------------------------------------------------------------------------------------------- ジャンプ先「decoder.php」 <?php $name1 = $_GET['name']; $from1 = $_GET['from']; $name2 = urldecode($_GET['name']); $from2 = urldecode($_GET['from']); echo 'デコード前 '; echo '名前:'.$name1.' フロム:'.$from1.'<br>'; echo 'デコード後 '; echo '名前:'.$name2.' フロム:'.$from2; ?>

    • 締切済み
    • PHP
  • Ethnaを利用したURLパラメータのマルチバイト文字とエンコード処理

    前画面よりhttp://localhost/?action_abc=true&test=あいうえお という画面へアクセスした時、 abc画面でtestパラメータを出力すると何故かShift_JISで表示されてしまい、 文字化けを起こしてしまいます。 (前画面・abc画面のactionやview、テンプレートはEUC-JPで作成、 URLパラメータにはurlencode()、urldecode()を使用) その為、出力する前にmb_convert_encoding()を使用しなければならない羽目になっています。 EthnaかPHPの仕様上、URLパラメータは必ずShift_JISになってしまうのでしょうか? また同じ関係で、urlencode()をした時点で、IEだと%~%~・・・と全ての文字が エンコードされるのですが、Firefoxだとhtmlspecialchars()のような動作をし、 エンコードが上手く出来ません。 (Firefoxの仕様上、そのリンクを押した時点でマルチバイトはエンコードされるようですが) 正しくエンコード・デコードさせる方法としてはどうするのが良いのでしょうか? どなたかご教示願います。

    • ベストアンサー
    • PHP
  • 日本語入力IME2002で、平仮名から全角英数に変えるやり方を教えて下さい。

    PC初心者です。 言語バーの平仮名「あ」をクリックすると、半角英数表示になってしまい、 全角英数文字を入力したい時は、半角英数表示部分をクリックして全角 英数を選択してクリックして使ってます。 この使い方は・・IME22002の本来の使い方なんでしょうか・・? 「CapsLock・英数・漢字番号」キーの切り替えだけで・・平仮名と全角 英数の切り替えはできないのでしょうか・・・? 全角英数を使いたい時に、いちいち半角英数表示部分をクリックして選択する のが面倒なんですが・・・。 みなさんはどうされているのか・・お聞きしてみたくて投稿させて頂きました。 よろしくお願いします。

  • excelで文字列の切り抜き

    excel2003でファイル名を取得したいのですが、 あるセルにc:\test\test.xlsと記入したら 隣のセルに自動でtest.xlsと表示させるにはどうしたらいいのでしょうか? 関数で表示したいのですが、フォルダが構成がいつも同じではなくても、 対応できる方法はありませんか?

  • file_get_contents関数で引数をURLにすれば、HTML

    file_get_contents関数で引数をURLにすれば、HTMLソースを取得できるのはわかるのですが、 例えば、URLが制限 255バイト?を超える場合、GETでなくPOSTタイプでHTMLを取得したいのですが、file_get_contents関数のように手軽にPOSTタイプで取得できる関数はありますか? PHP5を使っています。

    • 締切済み
    • PHP

専門家に質問してみよう