2バイトで作成されたフォルダ名(漢字やひらがななど)を、
ブラウザにツリー表示して、それがクリックされた時に
クリックされたフォルダ名を取得して、
ブラウザがそのフォルダ先を参照し、
フォルダ中のファイル名をブラウザ上に表示できるようにしています。
$_GETを用いて、フォルダ名を取得しているのですが、
2バイトのフォルダ名だと、中身がどうやらバケています。
フォルダ名が英数半角の時は、上手く処理されるのですが、
漢字やひらがななどの2バイトのフォルダ名だと、
どうしても上手くいきません。
エンコードのurlencode()関数やデコードのurldecode()関数
を用いて、いろいろやってみましたが、上手く変換してくれません。
URLと違って、パス名、フォルダ名なので、2バイトだとそもそも
$_GETで取得すること自体が無理なのでしょうか?
どなたか詳しい方、ご教授いただけると幸いです。
よろしくお願い致します。
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 は、とりあえず関係なさそうですけど・
この回答への補足
長くお付き合いいただき、本当にすいません。恐縮です。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)に渡している値が
おかしいかも??という感じでしょうか?
自己解決いたしました!
原因は、やはりフォルダ名を渡す時点で、バケていたようです。
htmlentities()を用いて、渡していたのですが、
第三番目の引数を指定せずに渡していたので、
ISO-8859-1 文字セットがデフォルトの文字エンコーディングとして使用されました。
第三番目の引数に、"SJIS"を指定して、
$_GETで取得した値を、教えていただいたソース「すごくちからわざ(php4版)」を
使用させていただき変換させてみたところ、
全角ひらがな、全角カタカナ、漢字のフォルダ名については、
正常な値となり、認識しました。
(ただ、半角カタカナは、まだダメみたいですが…)
<参考:htmlentities()>
http://php.s3.to/man/function.htmlentities.html
長々とお付き合いくださって、本当にどうもありがとうざいました。
根本原因にたどり着くまで、非常に助かり、
また、「すごくちからわざ(php4版)」も、とてもありがたいコードと
なりました。
どうも、ありがとうございました!m(__)m
No.10
- 回答日時:
>これは、何がおかしいのでしょう?
%u{16進4桁}
は、16進4桁がユニコードの文字コードを表しています。
そのつもりで、変換する手順なんですが、
30FB
は、(文字パレットなんかで確認して貰えると判ると思いますが)
・(ナカグロ)です。
その前の段階で、文字コードとして無い文字を割り当てようとしたので、ナカグロが割り当てられたのかもしれません。
ところで、その元のパス名はなんだったのでしょうか?
この回答への補足
フォルダ名は
/新しいフォルダ
です。
その上は、ルート(実際のHDDドライブのルートではなくて、
データ格納先としてプログラム内で指定した仮想ルート)です。
つまり、ルートのすぐ下に、/新しいフォルダ
としてフォルダを作成し、それをブラウザに表示させて、
そのフォルダ名をクリックすると、そのフォルダ名に移る
という具合にしたいわけです。
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;
}
}
に置き換えれば良いと思います。
この回答への補足
現在のプログラム内の $_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)+'・・・・;
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>";
?>
#もしかしたらこういう話ではないのかなぁという気がしてきましたが
どうでしょうか?
この回答への補足
ありがとうございます。
問題は、どうやらANo.5さんがご回答くださったように、フォルダ名をクリックした後、javascriptが走り、javascriptのencode()でエンコードしているので、PHPでデコードしても正しく戻らず文字化けしているらしいんです。
文字コードについては詳しくないので、皆さんからいただいた内容で試したり思考錯誤中です・・
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;
?>
この回答への補足
残念ながら、用いているのはPHP4なのです。
サーバー環境の変更できなくもないですが、さすがにPHPヴァージョンを変えることを依頼するのは無理そうです。
上記のコードをPHP4で使えるように記述し直し用いることは可能でしょうか?
<参考までに>
サーバ環境:Windows2003Server、IIS、PHP4.4.2
開発クライアント環境:WindowsXPpro、Apache2.0.55、PHP4.4.2
No.6
- 回答日時:
どうしてもクライアント側で
エンコードしなくてはならない理由があるなら
まずjavaScript側で
encodeURIComponentを使ってエンコードしておく。
php.iniは
mbstring.encoding_translation = Off
の設定にしておいて
$_GETで受けたデータをrowurldecodeして
更にUTF-8から内部コードにmb_convert_encodingしてやると
正しく動作しそうです。
いろいろ事情があるでしょうが
サーバー側でurlencodeしたものでリンクを
生成したほうが簡単だと思いますよ^^
この回答への補足
ありがとうございます。
サーバーはレンタルサーバーではないので、
ある程度、希望どおりに環境は変更してもらえます。
「サーバー側でurlencodeしたものでリンクを生成する」とは、
具体的にどういったものでしょうか?
ご教授いただけると幸いです。
No.5
- 回答日時:
この回答への補足
そのとおりです!
ブラウザ表示されたフォルダ名をクリックすると
JavaScriptでの処理に走ります。
以下の方たちに、補足したかったのですが、
ソースが複雑になっているので、掲示板では
ちょっと説明しきれず、思案していたところです。
参考URLはまだじっくり見ておりませんが、
早速、拝見させていただきます。
<補足追加させて下さい>
いただいたURLの、escape、unescapeを参考に
$_GET()内のバケ文字を変換してテスト表示してみたところ、
カタカナと半角カタカナのフォルダ名は、
問題なく戻すことができました。
しかし、ひらがなは余計にバケてしまい、漢字も一部戻りますが、
やはりバケる部分があるので、このままだと使えず・・
このあたりの原因は何なのか、もしおわかりになるようでしたら
ご教授下さいませ。
すでに、ブラウザ表示させたフォルダ名を、マウスクリックで
JavaScriptを走らせている箇所を多く作りこんでいるので、
今からJavaScriptをやめるのは、ちょっと大変なのです。
半角英数のフォルダでテストしながらほとんど作成してしまったので、
後になって、2バイトフォルダ名がこのようになってしまうとは、
気がつかず・・・うかつでした。m(__)m
No.4
- 回答日時:
普通は、そんなことが面倒なので、URL直接指定
では2バイト系の文字の受渡しはしません。
ユーザーが任意に入力した文字を引数にしたいなら
formを使って正規の手段で渡せばすみます。
そうでないなら、任意のidなどで管理するのが
確実です。構造を考え直してはいかがでしょうか?
No.3
- 回答日時:
そもそものフォルダリンクを出力している部分はどうなっているのでしょう?
(そこが間違ってると後でいくらいじっても変になるだけ)
あと出力している画面はEUCですか?
SJISの場合
mbstring.encoding_translation = Off
とされてますから自分でそれなりの処理をしてますか?
私はあまり文字コードに長けていないので
記載された化け方を見てもぴんと来ません。
>どなたかピンときませんか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Excel(エクセル) 【マクロ】フォルダAからダBへファイルを、ファイルの更新日時の条件で、1つづつ移動するには? 3 2022/08/25 09:56
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Windows 10 Windows10の回復環境 2 2023/02/03 19:13
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- Excel(エクセル) 【VBA】フォルダAにある2つのファイルの内1つを、フォルダBへ。もう1つを、フォルダBへ移動したい 6 2022/07/26 08:51
- Windows 10 ファイルエクスプローラーでフォルダを閉じる操作について 2 2022/10/15 11:06
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
i18n_convert と mb_convert_e...
-
こちらはただの直列処理ですか?
-
onedrive にexcelファイルをア...
-
フォントの色を変えるには?
-
VBでメールを送る時のSMT...
-
ワードプレスサイト PHP8.0.25...
-
FTPコマンドでディレクトリごと...
-
アップロード画像数でCSSを分け...
-
二重投稿防止方法
-
PHPのif文でその処理を途中で抜...
-
入力フォームの空白や改行を制...
-
php5のrename()は日本語をリネ...
-
sqlで日付が一番古いデータの月...
-
HYのAM11:00のラップの部分の歌...
-
php 完了画面の送信メールのコ...
-
htmlのエラーについて(デバッグ)
-
PHPExcel処理速度が遅い
-
phpでPEAR::DBを使っているので...
-
URLが.PHPってどういう...
-
PHP8を使うと、大量のWarningが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エンコーディングについて
-
phpのhex2binについてphpで、ut...
-
ハシゴの「高」が「?」に置き...
-
PHPでCSV出力時の文字化け(一部)
-
$str=preg_replace('/\\u3000/'...
-
PHPの文字化けした文字だけ削除...
-
phpMyAdminで文字化け
-
【PHP】ファイル読み込みで...
-
MySQL文字コード
-
windowsXP、XAMPPでメーラーMer...
-
i18n_convert と mb_convert_e...
-
データベースから取り出した日...
-
scandir関数取得結果の文字化け
-
PHPフォーム→PHP確認画面で...
-
文字化け
-
XML出力時の日本語一部文字化け
-
header("location~")をPOSTで...
-
PHPの文字コード (php.iniの...
-
PHPExcelで日本語(漢字)ファ...
-
mysql utf8、php・euc-jp で出...
おすすめ情報