旅行好きのおしりトラブル対策グッズ3選

$old = "名前";
$new = mb_convert_encoding($old,"EUC-JP","auto");
echo "$new";

上のスクリプトを実行すると、’名前’が半角の’?’に
なるんですよー。
何ででしょうか?
ページもEUC-JPだし、phpもEUCです。

PHP Version 4.3.10で、php.iniの
mbstring.internal_encodingはEUC-JPです。
OSは、テストなので自分のPCのw2kです。

mb_convert_encodingが実験的だからなのでしょうか?
他にも同じようになる物があるのでしょうか?
対処方法はあるのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

以下の点を確認。



・<?php~?>をHTMLで囲み、METAタグで文字コードを明示的に指定。

・下記コードをプログラムの頭に設置。
mb_language("Japanese");//必須ではないけど一応
mb_internal_encoding("EUC-JP");//mb_convert_kana使用時に必須
mb_detect_order("ASCII,JIS,UTF-8,EUC-JP,SJIS");//mb_detect_encoding使用時に必須

・文字列の文字コード変更時に、変更前の文字列の文字コードを逐一取得する。
$buffer=mb_convert_encoding($buffer,"EUC-JP",mb_detect_encoding($buffer));

たぶん、mb_detect_orderの有無。でなければ、あきらめてUTF-8Nにする。
    • good
    • 0
この回答へのお礼

mb_detect_encoding($old)で文字コードを調べると、
UTF-8でした。という事は、
mb_detect_order("ASCII,JIS,UTF-8,EUC-JP,SJIS");
だと、EUCより優先順位のたかい、UTF-8になってしまい、
EUCを一番最初にすると、きちんと表示されました。

で、ここで問題の原点に気がつきました。
metaタグで、charset=EUC-JP を記入しているので、
FORMから送られてくる情報は、EUCなのです。
マルチバイト関連が実験的なら、あまり考えずにその
ままでもいいのかなー、と思いました。

お礼日時:2005/03/24 20:39

こんにちは。


おそらくphp.iniの設定でしょう。
最新のPHPや、もしくは古いPHPをインストールするとphp.iniの設定を修正しなくてはならないので注意が必要です。
php.iniの中身の一部を削除・書き換えたりして、試してみてください。おそらく、[mbstring] 内が怪しいでしょう。ここで設定されている値を色々書き換えて試してみてください。(注:php.iniがなくてもちゃんと動作しますので、[mbstring]の部分そっくり削除しても平気です)

また、PHPは文字コードの問題が非常に多いようなので、mbstring関連の関数はあんまり当てにしない方がいいかもしれません。特に、新しいバージョンのPHPは問題が多いような気がします。

ただ、送られてきたデータがどんな文字コードを使っているかが、確実にわかればmb_convert_encoding関数でうまく変換出来る確率が上がるようです。
確実に、送られてきた文字コードを判別したいなら自分で文字コードを判別する関数を作ってしまったほうが納得がいくでしょう。そんな難しくないです。わかりやすそうなのを厳選してみました。以下のサイトをご覧になれば文字コード判別関数程度ならすぐ作れると思います。

Perl言語で文字コード変換 :http://ash.jp/ash/src/codetbl/convcode_pl.txt
C言語版 :http://www.alib.jp/c/kanji
文字コード表 :http://ash.or.jp/code/codetbl2.htm
初心者でもわかりやすい :http://www.mars.dti.ne.jp/~torao/program/appendi …

どんなデータが送られてくるかを予想するのは、経験を積むしかないでしょう。
PerlやPHPだけで、サーバ構築やC言語の経験がないとなかなか難しいものがあると思います。
送られてくるデータはEUCと限定するのは、やめましょう。(これについてはクロスサイト スクリプティングという単語を検索してみてください。)

長くなりましたが、ご質問の問題を解決す方法として、以下を順番に試していってみてください

・php.iniを色々いじってみる
・mb_convert_encoding($old,"EUC-JP","UTF-8,EUC-JP,JIS,SJIS")の、"UTF-8,EUC-JP,JIS,SJIS"の順番を変えてみる
・古いバージョンのPHPを入れてみる
・OSを変える
・文字コードチェック及び、文字コード変換関数を自分で作る

※参考に:php.iniのmbstringディレクティブの各項目を以下のように修正してみてください。

default_charset = EUC-JP
mbstring.language = Japanese
mbstring.encoding_translation = On
mbstring.http_input = auto
mbstring.http_output = EUC-JP
mbstring.internal_encoding = EUC-JP
mbstring.script_encoding = EUC-JP
mbstring.substitute_character = none


ご健闘を祈ります。
    • good
    • 0
この回答へのお礼

PHPは4.3.10なのでさらに下げるのは、ちょっと。^^;
default_charset = EUC-JPにしたんですが、最終的に使っているサーバに、no valueにあわせたのでした。
あくまで、私の環境はテスト・開発用だしとりあえず配布は考えていないので。
htaccessを変える手もあるかと思いますが、さらに勉強が・・・。

とりあえず、mb_convert_encodingで優先度を変える方法で解決しました。
が、日本語の文字のコードの認識がどうも怪しいので、英数字のコードで認識・変換させようかと。
あとは、労力と時間と誤認確率の問題で、今の所は保留してます。^^;
ありがとうございます。

お礼日時:2005/03/26 13:28

w2kと言う事なので、当方Linuxとは違うかもしれませんが。

。。

$new = mb_convert_encoding($old,"EUC-JP","auto");
の場合、"auto"では駄目な時が私の環境でもあります。
分る限り、"auto"ではなく、"SJIS"とか、"UTF-8"とか指定した方が良いです。

現在の内部エンコーディングの検出は
echo mb_internal_encoding();
で出来ますし、設定も
mb_internal_encoding("UTF-8");
あたりで出来ます。当然エディタの保存エンコーディングとの整合性が必要かと思います。

# 引っかかるとうまくいかないんですよねぇ~。
    • good
    • 0
この回答へのお礼

mb_internal_encoding()はEUCでした。
少し私も調べて見ました、autoでは、解決できない事も
あるみたいですね。
meta タグで charset=EUC-JP" にしているのですが、
万が一のためにコードを統一しようとしたのが、過剰反応
だったみたいです。

お礼日時:2005/03/24 20:26

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q急に文字化けを起こすようになりました

こんにちは。

さて、過去2年間位、特に問題のなかったページで、突如文字化けを起こすようになりました。

・mysqlバージョン・・・申し訳ないのですが、今(深夜ゆえ)分かりません。
・mysqlの文字コード・・・EUC
・HPの文字コード・・・UTF-8

サーバー側にデータベースの破損等聞いても、特に問題はないと言われました。

mb_convert_encoding($v,'UTF-8','EUC-JP');

mb_convert_encoding($v,'UTF-8',"EUC-JP,UTF-8,auto");
にしたり、色々やっても変わりません。

本当に2年間位は、正常だったのです。特に設定もいじってません。

情報が不足しているかとは思いますが、(会社に行けばバージョンなど分かります。)

何が原因なのか、思いつく事があれば、教えてください。

よろしくお願いします。

Aベストアンサー

おはようございます。
外しているかもしれませんが、紹介するURLの記事が解決の糸口かもしれないと感じました。

参考URL:http://oshiete1.goo.ne.jp/qa1288725.html

Qillegal string offset

php5.3では動いていたプログラムをphp 5.4 で動かしたらwarning illegal string offsetが出て困っています。以下のプログラムでwarningが出ないようにするにはどのようにコーディングすればよいのでしょうか?


$a = array('exists' => 'foo');
if ($a['exists']['non_existent']) {
print 1;
}
print 2;
exit;

Aベストアンサー

isset()を使えばいいと思います

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

QリダイレクトでPOST

教えてください。

リダイレクトの際、POSTで次のページにデータを渡すことは可能でしょうか?

GETだと
header("Location: "a.php?no=".$no);
と、問題なくできるのですが、
できれば、パラメータを隠したいと思います。

以上ですが、よろしくお願いします。

Aベストアンサー

多分できないです。
それに、結局クライアント側に情報を送信しているのだから、POSTにしたところでパラメータを隠した事にはならないですし。
本当に隠すならサーバ側でセッション情報を引き継ぐような形にしないとダメでしょう。

AJAXのかたちにして、ページ遷移を見えなくするというのが手っ取り早いかも。

QHTMLフォームのSELECTの幅を一定にするためには?

HTMLフォームのSELECTの幅を一定にするためにはどのようにすれば
いいのでしょうか?

CSS等で設定できるとありがたいのですが、やり方がわかりません。

Aベストアンサー

<select style="width: 200px">

Qホームページでファイルをダウンロードさせる

お世話になります。
会社のホームページを制作中です。
マニュアルなどをアップしておき、ユーザーにダウンロードしてもらうページを作ろうと思っています。
<ベクターのような>
参考になる情報ありましたら教えてください。
宜しくお願いいたします。

Aベストアンサー

ダウンロードについて、
参考URLのページに分かりやすく書いてあるようです。
例もあるのでぜひ参考にしてください。

参考URL:http://www.tohoho-web.com/wwwxx013.htm

Qhtmlのfileタグに自動で値を入れる方法

htmlのタグでいって
<input type="file">を用いてファイルをサーバーにアップロードしたいと思っています。で、このとき、ファイル名は任意に選べるのではなく固定で送信したいと思っています。

すなわち、HTMLを読み込んだ時点で、fileのテキストボックスにファイルパスが埋め込まれているか、JavaScriptで、ファイルパスを自動入力するようにしたいと思っています。

最終的には、form内のオブジェクトをすべて非表示にし、onload時にsubmitするような形にしたいと思っています。いろいろ事情があって苦肉の策になっています…。

とりあえず(だめだとは思っていたのですが)
<input type="file" value="ファイルパス" name="filepath">
と直書きにしてみたり
document.all.filepath.value = "ファイルパス";
などとしてみたりしましたがだめでした…。
W3C勧告の使用上はvalueでファイルパスを指定できるようになっているようなのですが、現在の一般的なブラウザでは禁止されているようですね。

このような場合、何らかの方法でfileにファイルパスを自動入力することはできますでしょうか?
もしできない場合、何らかの方法で実現する方法はありますでしょうか?よろしくお願いします。

ちなみに実現できればいい環境は
WinXP環境のIE6です。言語はクライアント言語はJavaScriptのみで、という条件付です。
できないかもしれないのですが、こういうのって必要になるときもあるよなーなどと思っており、もしかしたら解決方法があるかもしれないと思い質問しました。よろしくお願いします。

htmlのタグでいって
<input type="file">を用いてファイルをサーバーにアップロードしたいと思っています。で、このとき、ファイル名は任意に選べるのではなく固定で送信したいと思っています。

すなわち、HTMLを読み込んだ時点で、fileのテキストボックスにファイルパスが埋め込まれているか、JavaScriptで、ファイルパスを自動入力するようにしたいと思っています。

最終的には、form内のオブジェクトをすべて非表示にし、onload時にsubmitするような形にしたいと思っています。いろいろ事情があって苦肉...続きを読む

Aベストアンサー

やっぱ無理じゃないでしょうか。
なにか裏ワザ的な方法で一時的にできたとしても、いつか直されるかもしれないのでおいそれとは使えないし。

>W3C勧告の使用上はvalueでファイルパスを指定できるようになっている
→参考URL 「ユーザが明示的に送信を求めたファイル以外のものは送ってはいけない」とあります。

参考URL:http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/appendix/notes.html#forms-security

Q文字列から、特定の文字を削除したい

アンケートで入力された値を受け取り、メールで送信しているのですが、受け取った値から、特定の文字列を削除することは可能でしょうか?

例えば電話番号の入力の場合、
03-xxxx-xxxx →03xxxxxxxx
077-xxx-xxxx →077xxxxxxx
のように、-(ハイフン)が入力されていたら、-を削除した文字列に置換してメール送信したいのです。
入力する時に、3つのテキストエリアに分けるのは諸事情でできないので、特定の文字を削除する関数か処理方法がありましたら、教えていただきたいです。
よろしくお願いします。

Aベストアンサー

str_replace
http://itbtech.itboost.co.jp/man/php_man/function.str-replace.html

<?php
$orig_telno = "03-xxxx-xxxx";

$telno = str_replace("-", "", $orig_telno);
echo $telno;

03xxxxxxxx

“PHP 文字列” あたりをキーワードに検索すれば
そんなに難しいものでもないような。

Qforeachで回った数を表示したい

単純な質問ですみません。
====
//getTestlistは別ファイルで定義済み。
<?
$testlist=getTestlist();
foreach($testlist as $test){
?>


<? } ?>
====
例えば↑こんなふうにforeachで$testlistが存在するだけ回したとします。
そのときに何回まわったか?($testが何件あったか?)だけを表示したいのですが、そんなことってできますか?
表示したい位置は<? } ?>の外側にと考えています。
あさってな質問でしたらすみません。
phpVer 4.3

よろしくお願いいたします。

Aベストアンサー

<?
$testlist=getTestlist();
$n=0;
foreach($testlist as $test){
$n++;
?>
<?}?>

<?=$n?>回
とかでよいかと思います。

途中でbreakなどが無ければ
<? echo count($testlist) ?>でも良いかも知れません。

Q【PHP】配列のキー名の修正は可能ですか?

PHP5利用者です。
例えば、

$myArray = array('ringo'=>200, 'momo'=>300, 'banana'=>100);

と設定したあと、momo を sumomo に一発修正する方法はあるのでしょうか?
momo を消して sumomo 追加では順番が変わりますし、
$myArray → $myArray2 に全要素移し替えというのも多次元配列の時などは煩雑ですし・・・

関数など、もしワンタッチでできる方法があるなら教えてください。
ないならないであきらめて地道な手順でやりたいと思います。
よろしくお願いいたします。

Aベストアンサー

ワンタッチと言えるかどうか知りませんが、こんな方法が楽かと

<?php
$myArray = array('ringo'=>200, 'momo'=>300, 'banana'=>100);

$keys=array_keys($myArray);
$keys[array_search('momo',$keys)]='sumomo';
$myArray = array_combine( $keys, $myArray );

print_r($myArray);
?>


人気Q&Aランキング

おすすめ情報