PHPで絵文字を壊さずに文字コードや全角半角変換を行う方法
    このエントリをはてなブックマークに登録

2007/11/26 月曜日 matsui Posted in PHP 1 Comment »

通常「mb_convert_encoding」や「mb_convert_kana」を使うと、iモードやEZWebの絵文字(SJIS形式)は壊れてしまいます。

壊れてしまう例

$str = '絵文字[晴れ]';

$str = mb_convert_encoding($str, 'EUCJP', 'SJIS');
$str = mb_convert_encoding($str, 'SJIS', 'EUCJP');

// 出力
echo $str;

例:通常のコンバートの場合
henkan_tips1.gif

 

しかしちょっとしたことで、絵文字の破壊を防ぐことができます。

文字コードを指定するときに

  • SJIS
  • EUC-JP

ではなく、

  • SJIS-WIN
  • EUCJP-WIN

を利用すればOKです。

以下がサンプルコードです。

 

文字コード変換のサンプル

$str = '絵文字[晴れ]';

$str = mb_convert_encoding($str, 'EUCJP-WIN', 'SJIS-WIN');
$str = mb_convert_encoding($str, 'SJIS-WIN', 'EUCJP-WIN');

// 出力
echo $str;

文字コード変換しても壊れません
henkan_tips2.gif

 

全角→半角変換のサンプル

$str = '絵文字[晴れ]も半角化もダイジョウブ';

// 文字コードを設定
mb_internal_encoding('SJIS-WIN');
$str = mb_convert_kana($str, 'ak');

// 出力
echo $str;

半角変換しても平気です
henkan_tips3.gif

 

なお、上記の例では、

  • 「SJIS-WIN <> EUCJP-WIN」

となっていますが、

  • 「SJIS-WIN <> UTF-8」

の変換でも特に問題はありません。

 

関連:



iモード絵文字をUnicode形式からSJIS形式に逆変換するPHPサンプル
    このエントリをはてなブックマークに登録

2007/11/24 土曜日 matsui Posted in DoCoMo, PHP No Comments »

昨日ご紹介した「iモード絵文字をSJIS形式からUnicode形式に変換するPHPサンプル」に続き、Unicode形式からSJIS形式への逆変換のサンプルPHPをご紹介します。

このような変換を施すことで、バイト数を削減できますし、i絵文字などがインストールされているPCでは絵文字を表示できるため、管理画面などでの利用に便利です。

 

$str = '絵文字コード&#xE6D2;を含む文字列';

// iモード拡張絵文字(Unicode形式)を検索
$pattern = '/&#x(E6[3-F][0-9A-F]|E7[0-5][0-9A-F]);/';
preg_match_all($pattern, $str, $arr); // $arr[0]に対象絵文字が格納される

// 絵文字に置換
$rep_arr = array();
foreach($arr[0] as $value) {
	$hex = substr($value, 3, 4);
	$dec = hexdec($hex);
	if (58942 <= $dec AND $dec <= 59035) {
		// 絵文字No.1 ~ No.94
		$dec = $dec + 4705;
	} elseif (59099 <= $dec AND $dec <= 59223) {
		// 絵文字No.118 ~ No.166、拡1~拡76
		$dec = $dec + 4773;
	} elseif ((59036 <= $dec AND $dec <= 59045) OR
		(59052 <= $dec AND $dec <= 59054) OR
		(59057 <= $dec AND $dec <= 59059) OR
		(59063 <= $dec AND $dec <= 59066) OR
		(59086 <= $dec AND $dec <= 59098)) {
		// 絵文字No.95 ~ No.117、No.167 ~ No.176
		$dec = $dec + 4772;
	} else {
		continue;
	}
	$rep_arr[$value] = pack('n', $dec);
}

// 置換処理
$str = strtr($str, $rep_arr);

// 出力
echo $str;

※ソースはSJISで記述してください。

実行例:
iemoji_conv2.gif

 

関連:



iモード絵文字をSJIS形式からUnicode形式に変換するPHPサンプル
    このエントリをはてなブックマークに登録

2007/11/23 金曜日 matsui Posted in DoCoMo, PHP 3 Comments »

今回は、iモード絵文字をSJISバイナリ形式から、Unicodeテキスト入力(&#xxxx;)形式に変換するPHPのサンプルコードをご紹介します。

文字コード変換や、DBに格納する際など、SJISバイナリ形式では、文字化けなどの問題が起こるケースが多々あります。
そんな時には下記のコードでUnicodeテキスト入力形式に変換することで、データがぐっと扱いやすくなります。

 

$str = '[SJISバイナリ絵文字コードを含む文字列]';

// 文字コードを設定
mb_internal_encoding('SJIS');
mb_regex_encoding('SJIS');

// 正規表現を定義
$sjis  = '[\\x81-\\x9F\\xE0-\\xF7\\xFA-\\xFC][\\x40-\\x7E\\x80-\\xFC]
|[\\x00-\\x7F]|[\\xA1-\\xDF]';		// 実際には1行で入力
$emoji = '[\\xF8\\xF9][\\x40-\\x7E\\x80-\\xFC]';
$pattern = "/\\G((?:$sjis)*)(?:($emoji))/";

// 絵文字を検索
preg_match_all($pattern, $str, $arr); // $arr[2]に対象絵文字が格納される

// 絵文字を置換
$rep_arr = array();
foreach($arr[2] as $value) {
	$emoji_cd = unpack("C*", $value);
	$hex =  dechex($emoji_cd[1]) . dechex($emoji_cd[2]);
	$dec = hexdec($hex);
	if (63647 <= $dec AND $dec <= 63740) {
		// 絵文字No.1 ~ No.94
		$dec = $dec - 4705;
	} elseif (63872 <= $dec AND $dec <= 63996) {
		// 絵文字No.118 ~ No.166、拡1~拡76
		$dec = $dec - 4773;
	} elseif ((63808 <= $dec AND $dec <= 63817) OR
		(63824 <= $dec AND $dec <= 63826) OR
		(63829 <= $dec AND $dec <= 63831) OR
		(63835 <= $dec AND $dec <= 63838) OR
		(63858 <= $dec AND $dec <= 63870)) {
		// 絵文字No.95 ~ No.117、No.167 ~ No.176
		$dec = $dec - 4772;
	} else {
		continue;
	}
	$replacement = '&#' . strtoupper(dechex($dec)) . ';';
	$str = mb_ereg_replace($value, $replacement, $str);
}

// 置換処理
$str = strtr($str, $rep_arr);

// 出力
echo $str;


※ソースはSJISで記述してください
※表示の都合上改行を入れている行があることにご注意ください

実行例:
iemoji_conv1.gif

逆変換(Unicode形式→SJIS形式)のサンプルは、また後日ご紹介させていただきます。

追記:
逆変換の記事も書きました。下記リンクをご参照ください。

 

関連:



PHPの絵文字変換ライブラリ「MobilePictogramConverter」がバージョンアップ
    このエントリをはてなブックマークに登録

2007/11/18 日曜日 matsui Posted in PHP, ソフト紹介, 記事紹介・リンク No Comments »

先日ご紹介させて頂いたばかりの、PHPで作られた3キャリア対応絵文字変換ライブラリ「MobilePictogramConverter」が、2007/11/17付けでバージョンアップしたようです。
現在の最新verは1.1.0となります。
活発に開発が進んでいるようですね。

→ 開発Blog「PHPとか」 MobilePictogramConverter 1.1.0 リリースのお知らせ [hatena.ne.jp]
→ ダウンロードページ MobilePictogramConverter [php-develop.org]

 

「かなりのコード修正が入っているので、以前のバージョンを使用されている方は早急にアップデートする事をお勧めします。」とのことです。
変更点は次のようにアナウンスされています。

・対応/追加

 1. SoftBank絵文字のShift_JIS(バイナリコード)に対応
 2. 文字列に含まれる絵文字の数を返す、Countメソッドの追加

・修正/変更

 1. PHP4で正常に動作しないバグを修正
 2. SoftBank絵文字(UTF-8)が正常に変換されないバグを修正
 3. EZweb絵文字(UTF-8)を変換する際に使用される、
   マップファイルを使用しない様に変更
 4. 定数名 MPC_CHARSET_SJISをMPC_FROM_CHARSET_SJISに変更
 5. 定数名 MPC_CHARSET_UTF8をMPC_FROM_CHARSET_UTF8に変更
 6. メソッド名 isEmojiをisPictogramに変更
 7. i-mode絵文字(Web入力コード)から他の絵文字へ変換する際に
   一部の絵文字が変換されないバグを修正
 8. コーディングルールを変更 (インデント等)

私も検証等で微力ながら協力したいと思います。
rysterさん、色々と大変でしょうけれど、これからも頑張ってください。

 

関連:



ケータイに絵文字入りメールを送信するには(SoftBank編)
    このエントリをはてなブックマークに登録

2007/11/17 土曜日 matsui Posted in PHP, SoftBank 11 Comments »

iモード編au(EZWeb)編、とご紹介してきた、絵文字入りメール送信プログラム。
最後はソフトバンク編です。

ソフトバンク向けのサンプルコードは次の通りです。

サンプルコード(ソフトバンク用)

<?php
// ソフトバンクに絵文字入りメールを送るサンプル

$to = '[ソフトバンクのアドレス]@softbank.ne.jp';
$from = 'example@example.jp';

$subject = '$Pe絵文字入り題名デス$OW';
$body = '絵文字入りの$E#本文デス。$E%';

// MIMEエンコーディングを行う
$subject = "=?shift_jis?B?" . base64_encode($subject) . "?=";
$body = base64_encode($body);

// ヘッダを作成
$headers = "From: " . $from . "\\n";
$headers .= "MIME-Version: 1.0\\n";
$headers .= "Content-Type: text/plain; charset=Shift-JIS\\n";
$headers .= "Content-Transfer-Encoding: base64";

// メールを送信
$res = mail($to, $subject, $body, $headers);

// 結果を取得
if ($res) {
	echo "OK\\n";
} else {
	echo "NG\\n";
}
?>

※ソースコードはSJISで記述しています
※Blog上からは絵文字が正常に表示できません、絵文字部分は入力し直してください。

 

ソフトバンクの絵文字メール送信は割とシンプルで、Webと同じように絵文字コードをコピペして、本文やタイトルに貼るだけです。
あとはドコモと同様に、Shift-JISのヘッダをつけてメールを送信してあげればOKです。

ただし、メールが表示できるかどうかは、端末のメーラーに依存してしまうようなので、古い機種や特殊な機種に関しては絵文字の表示は保証できないようです。

emoji_sb.jpg

 

関連: