$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.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" にしているのですが、
万が一のためにコードを統一しようとしたのが、過剰反応
だったみたいです。
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で優先度を変える方法で解決しました。
が、日本語の文字のコードの認識がどうも怪しいので、英数字のコードで認識・変換させようかと。
あとは、労力と時間と誤認確率の問題で、今の所は保留してます。^^;
ありがとうございます。
お探しの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】ファイル読み込みで...
-
phpでPEAR::DBを使っているので...
-
フォントの色を変えるには?
-
onedrive にexcelファイルをア...
-
php5-extensions を make でき...
-
CFileDialogの最初のディレクト...
-
PHPのみでの背景色は指定できる...
-
リンク先を隠す方法はないでし...
-
2つの画像ファイルが異なるファ...
-
PHPのif文でその処理を途中で抜...
-
index.phpに入るには、どうすれ...
-
3つ以上の論理積は利用可能なの...
-
「クラス関数」「メンバ関数」...
-
index.phpって何ですか? 具体...
-
Q)PHPでメール送信について
-
PHPのFTP関数ftp_fgetエラーに...
-
smartyでホームページ上の画像...
-
phpの処理中に画面表示ををする...
-
【file_exists】ファイルが存在...
-
別ファイルの変数を呼び出した...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
$str=preg_replace('/\\u3000/'...
-
mb_convert_encoding で?になる。
-
i18n_convert と mb_convert_e...
-
PHPの文字化けした文字だけ削除...
-
header("location~")をPOSTで...
-
ハシゴの「高」が「?」に置き...
-
mysql utf8、php・euc-jp で出...
-
phpのhex2binについてphpで、ut...
-
windowsXP、XAMPPでメーラーMer...
-
エンコーディングについて
-
PHPフォーム→PHP確認画面で...
-
データベースから取り出した日...
-
Content-Typeが機能していない?
-
POST文字列が化ける(外字)
-
scandir関数取得結果の文字化け
-
文字化け
-
【PHP】ファイル読み込みで...
-
phpMyFaqでの文字化けについて
-
XML出力時の日本語一部文字化け
-
urlencodeしていない日本語をPA...
おすすめ情報