スレッド表示 | フラット表示〕 全トピック 920 件中 768 番目 次≫ ≪前

外字(絵文字)のpostで字化け

created: 2003-10-28 02:57 | modified: 2003-10-31 16:39 | reply: 6

[823] 外字(絵文字)のpostで字化け

user: nic | created: 2003-10-28 02:57
a.phpからb.phpへ外字(i-mode絵文字)をpostした際、どうしても字化けしてしまいます。
http://www.sound-uz.jp/php/tips/_test/chform.html
の用に、外字・普通の文字混合のpost際字化けしないようにはどのように設定したらいいのでしょうか?

PHP.ini設定は
mbstring.detect_order auto
mbstring.encoding_translation On
mbstring.func_overload 0
mbstring.http_input auto
mbstring.http_output EUC-JP
mbstring.internal_encoding EUC-JP
mbstring.language Japanese Japanese
mbstring.substitute_character no value

携帯用のため「SJIS」で出力するために
mb_http_output('Shift_JIS');
mb_internal_encoding('Shift_JIS');
mb_detect_order("SJIS,euc,jis,UTF-8,ASCII");
ob_start('mb_output_handler');
これらをスクリプト(a/bとも)中にいろいろ記入

外字は登録済みで


以下ソース<body>内概要は

a.php
**********
<form action="b.php" method="post">
<input name="te" type="text" value="、">(←絵文字が入ってます)
<input type="submit" name="Submit" value="送信">
</form>
**********

b.php
**********
<?
extract($_POST);
extract($_GET);
echo mb_detect_encoding($te)."=文字コード<br><br>";
echo $te."=to<br>";
echo mb_convert_encoding($te, "utf-8")."→utf-8<br>";
echo mb_convert_encoding($te, "sjis")."→sjis<br>";
echo mb_convert_encoding($te, "euc")."→euc<br><br><br>";
?>
**********

出力は絵文字1文字の場合出力されたりされなかったり
文字混合の場合は全然だめです。
文字コードはUTF-8とでたりASKIIとばらばらです。

どなたかご教授下さいませ
reply: 824 返信 編集 削除

[824] 変換すると文字コードが失われます

user: ゆうじ | created: 2003-10-28 11:47
絵文字変換のところ、
いつまでもテスト中で申し訳ありません。

まだよくわかってないところがあり途中経過報告になりますが、
i-modeの絵文字は、外字(SJISで定義されている文字コードの範囲外)なので、
mbstring を使って変換すると、変換後の文字コードは保証されません。
どのようなコードになるかわかりませんのでまず文字化けします。

mbstringが使える環境であっても
php.iniでは初期設定のままにしておき、
必要にな部分にだけエンコードを行ったり、
設定を有効にしたりする必要があります。

# 端末がi-modeと決め打ち出来るなら、
# ソースをSJISで書いてしまうのが簡単かと思います。
# ただし、SJISは内部エンコーディングで正式サポートされてないので
# これまた保証外ですが・・・。
#
# このサイトのレンタルサーバーは現在この状態です。
# php.iniのmb関連はすべて初期値のままです。


i-modeの絵文字を完全に処理するには、
文字ではなく、バイナリーデータとして取り扱う必要があります。
私のわかる範囲はココまで。
実際どのようにすればよいのか頭がついてきません。
中途半端ですみおません。
Parent: 823  reply: 827 返信 編集 削除

[827] うむ?

user: nic | created: 2003-10-28 17:07
例えば
a.php
**********
<form action="b.php" method="get" >
<?
$te2=bin2hex("。「・クiro一イいイ");(←絵文字入ってます)
?>
<input name="te2" type="text" value="<? echo $te2;?>">
<input name="Submit" type="submit" value="送信">
</form>
**********

b.php
**********
<?
extract($_POST);
$te2 = pack('H*',$te2);
echo mb_detect_encoding($te2)."=文字コード<br>";
echo $te."=to<br>";
?>
**********

と16進数に変換→復元すればうまくいくけど、
postの前にPHP処理しなくてはならないし・・・
(javascriptとかで出来ないのかな?)

post(又はget)される変数は %F8%9F (晴れマーク)と
送信されているので%を抜けばいいかと思ったのですが %F8%9F
自体特殊文字?なのでereg_replace()等で%を抜くことも出来ない・・
うむ?? もう少しいろいろやってみますが、

文字をバイナリーデータとして取り扱う方法が少しわからないので
参考HPないしご教授していただけないでしょうか?
Parent: 824  reply: 828 返信 編集 削除

[828] 入力から出力までエンコードしないこと

user: ゆうじ | created: 2003-10-28 18:07
バイナリーで扱う方法は良くわからないので
ココとか参考になるでしょうか。
http://t-kusu.com/yamiburo/php/php_mobile.html


> echo mb_detect_encoding($te2)."=文字コード<br>";

この部分ですが、どのような前処理をしても
絵文字を含むデータをエンコードした時点で文字コードが失われます。
入力から出力まで一切エンコードしないのが鉄則です。

どうしてもエンコードする必要があるならば
絵文字を受け取った時点で10進数表記に直してしまうのが簡単のようですが、
ただ10進数表記出来ない絵文字もあるので
この方法でも全ての絵文字をカバーできませんね。


まったく別の手法として、絵文字コードを
マッピングしなおすという手が考えられます。

http://tech.ymirlink.co.jp/
こちらの、Unicode::Japanese が
よさそげなのですが、ただ C で書かれています。
PHPでこれほどのことを実用レベルにできるか疑問です。
Parent: 827  reply: 830 返信 編集 削除

[830] 追加

user: ゆうじ | created: 2003-10-28 20:20
このようなものを発見しました。
http://sourceforge.jp/projects/emoji/
Parent: 828  reply: 861 返信 編集 削除

[861] もしよろしければ・・

user: nic | created: 2003-10-31 16:20
もしよろしければ
http://www.sound-uz.jp/php/tips/_test/index2.php
のソースが見たいのですがだめでしょうか?
Parent: 830  reply: 862 返信 編集 削除

[862] かまいませんよ。

user: ゆうじ | created: 2003-10-31 16:39
こちらがソースです。
(ソースの文字コードはSJISです。)
http://www.sound-uz.jp/php/tips/_test/index2.php.txt

ソース中のinclude_once("./exchar.php");は、
携帯端末の解説ページで挙げたサンプルコードをファイルにまとめたものです。
Parent: 861  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 768 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑