$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が実験的だからなのでしょうか?
他にも同じようになる物があるのでしょうか?
対処方法はあるのでしょうか?
No.2ベストアンサー
- 回答日時:
以下の点を確認。
・<?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にする。
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なのです。
マルチバイト関連が実験的なら、あまり考えずにその
ままでもいいのかなー、と思いました。
No.3
- 回答日時:
こんにちは。
おそらく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
ご健闘を祈ります。
PHPは4.3.10なのでさらに下げるのは、ちょっと。^^;
default_charset = EUC-JPにしたんですが、最終的に使っているサーバに、no valueにあわせたのでした。
あくまで、私の環境はテスト・開発用だしとりあえず配布は考えていないので。
htaccessを変える手もあるかと思いますが、さらに勉強が・・・。
とりあえず、mb_convert_encodingで優先度を変える方法で解決しました。
が、日本語の文字のコードの認識がどうも怪しいので、英数字のコードで認識・変換させようかと。
あとは、労力と時間と誤認確率の問題で、今の所は保留してます。^^;
ありがとうございます。
No.1
- 回答日時:
w2kと言う事なので、当方Linuxとは違うかもしれませんが。
。。$new = mb_convert_encoding($old,"EUC-JP","auto");
の場合、"auto"では駄目な時が私の環境でもあります。
分る限り、"auto"ではなく、"SJIS"とか、"UTF-8"とか指定した方が良いです。
現在の内部エンコーディングの検出は
echo mb_internal_encoding();
で出来ますし、設定も
mb_internal_encoding("UTF-8");
あたりで出来ます。当然エディタの保存エンコーディングとの整合性が必要かと思います。
# 引っかかるとうまくいかないんですよねぇ~。
mb_internal_encoding()はEUCでした。
少し私も調べて見ました、autoでは、解決できない事も
あるみたいですね。
meta タグで charset=EUC-JP" にしているのですが、
万が一のためにコードを統一しようとしたのが、過剰反応
だったみたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- その他(プログラミング・Web制作) 文字コード及びフォントに関する次の記述を読み,適切なものをすべて選べ。 ASCIIとは,英数字だけを 4 2023/01/11 19:10
- PHP phpの imap_search で漢字コード 1 2022/09/06 17:32
- PHP jpgraphで表示されない 2 2022/10/22 09:12
- その他(プログラミング・Web制作) pythonのpandasのcsvの外部結合(outer_join)した際に列が想定とは異なる事象 1 2022/05/25 13:23
- PHP PHP MySql ページング 2 2022/09/20 06:38
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- その他(プログラミング・Web制作) sedの動作 2 2022/10/10 13:38
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- 英語 高校英語の問題 1 2023/05/23 15:29
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPの文字化けした文字だけ削除...
-
PHPExcelで日本語(漢字)ファ...
-
・オブジェクト指向のメリット...
-
onedrive にexcelファイルをア...
-
ローカル環境でのメール送信
-
「SMTP」が「localhost」ではな...
-
FTPコマンドでディレクトリごと...
-
CSV出力にHTMLが入ってしまう
-
Visual C++ 2005 Express Editi...
-
フォントの色を変えるには?
-
CFileDialogの最初のディレクト...
-
パースエラーとは?
-
error_reporting(0);にも関わら...
-
さくらサーバーにて、phpからメ...
-
たまに$_REQUESTの値が消える
-
php,mysqlにて画像パス保存/表...
-
リンク先を隠す方法はないでし...
-
「クラス関数」「メンバ関数」...
-
PHPのif文でその処理を途中で抜...
-
ヒアドキュメントの中で演算子...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エンコーディングについて
-
データベースから取り出した日...
-
i18n_convert と mb_convert_e...
-
mb_convert_encoding で?になる。
-
$str=preg_replace('/\\u3000/'...
-
PHPの文字化けした文字だけ削除...
-
mysql utf8、php・euc-jp で出...
-
scandir関数取得結果の文字化け
-
POST文字列が化ける(外字)
-
mb_convert_kanaについて
-
htaccessでの文字コード設定に...
-
SQLiteManagerが文字化け
-
ハシゴの「高」が「?」に置き...
-
phpのhex2binについてphpで、ut...
-
GETで値を渡すと、記号と数...
-
mail関数を使った際の文字コー...
-
php5,MySQL5で文字化けが起こる
-
XML出力時の日本語一部文字化け
-
年と曜が文字化け・・・対応策...
-
phpでMysqlにデータを書き込む...
おすすめ情報