アプリ版:「スタンプのみでお礼する」機能のリリースについて

$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が実験的だからなのでしょうか?
他にも同じようになる物があるのでしょうか?
対処方法はあるのでしょうか?

A 回答 (3件)

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

以下の点を確認。



・<?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

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


このQ&Aを見た人がよく見るQ&A