JavaScript から PHP の関数を呼び出す

JavaScript には、文字エンコーディングの変換機能が無い。

これが出来ると、何かと便利である。

今回は、リンクプロパティーで E-mail を選択したときに、メーラーでサブジェクトと本文が文字化けするとのご相談を受けた。

テストすると以下の様になった。

[FCKedito 2.3.x]
Outlook Express : JavaScript で escape された文字列
Thunderbird : JavaScript で escape された文字列

[FCKeditor 2.4.x]
Outlook Express : JavaScript で encodeURIComponent された文字列
Thunderbird : 正常に表示される

実は、すべてのメールソフトに対応する方法は、今の所無い。
今回はユーザーが最も多いと思われる Outlook Express 向けに対策を行う。

Outlook Express では、mailto: の subject パラメータと body パラメータを Shift-JIS として受け取る。
一方、FCKeditorの JavaScript は UTF-8 で書かれている。
よって、UTF-8 -> Shift-JIS -> encodeURIComponent を行う必要がある。

ここで問題なのが UTF-8 -> Shift-JIS 変換だ。

PHP ならば mb_convert_encoding で一発なのに。そうだ、Ajax で呼び出してしまえ!

と言うことで、以下の様に対策が出来た。

(1) FCKeditor/editor/dialog/fck_link/ に fckxml.js をコピー

(2) FCKeditor/editor/dialog/fck_link.html (head に以下を追加)

		<script src="fck_link/fckxml.js" type="text/javascript"></script>

(3) FCKeditor/editor/dialog/fck_link/encoder.php (新規作成)

<?php
//=================================================
// Encoder

$code = rawurlencode( mb_convert_encoding( $_GET[ 'str' ], $_GET[ 'to' ], $_GET[ 'from' ] ) ) ;

header ("content-type: text/xml") ;
echo "<?xml version="1.0" encoding="utf-8" ?>n" ;
?>
<Encoder code="<?php echo $code ; ?>" />

(4) FCKeditor/editor/dialog/fck_link/fck_link.js (修正)

...

//#### Parser Functions

var oParser = new Object() ;

oParser.ParseEMailUrl = function( emailUrl )
{
	// Initializes the EMailInfo object.
	var oEMailInfo = new Object() ;
	oEMailInfo.Address	= '' ;
	oEMailInfo.Subject	= '' ;
	oEMailInfo.Body		= '' ;

	var oParts = emailUrl.match( /^([^?]+)??(.+)?/ ) ;
	if ( oParts )
	{
		// Set the e-mail address.
		oEMailInfo.Address = oParts[1] ;

		// Look for the optional e-mail parameters.
		if ( oParts[2] )
		{
			var oMatch = oParts[2].match( /(^|&)subject=([^&]+)/i ) ;
			if ( oMatch ) oEMailInfo.Subject = decodeURIComponent( mb_convert_encoding( oMatch[2], 'UTF-8', 'SJIS-win' ) );

			oMatch = oParts[2].match( /(^|&)body=([^&]+)/i ) ;
			if ( oMatch ) oEMailInfo.Body = decodeURIComponent( mb_convert_encoding( oMatch[2], 'UTF-8', 'SJIS-win' ) ) ;
		}
	}

	return oEMailInfo ;
}

oParser.CreateEMailUri = function( address, subject, body )
{
	var sBaseUri = 'mailto:' + address ;

	var sParams = '' ;
	var sSep = '?' ;

	if ( subject.length > 0 )
	{
		sParams += sSep + 'subject=' + mb_convert_encoding( encodeURIComponent( subject ), 'SJIS-win', 'UTF-8' ) ;
		sSep = '&' ;
	}

	if ( body.length > 0 )
	{
		sParams += sSep + 'body=' + mb_convert_encoding( encodeURIComponent( body ), 'SJIS-win', 'UTF-8' ) ;
		sSep = '&' ;
	}

	return sBaseUri + sParams ;
}

function mb_convert_encoding( str, enc_to, enc_from )
{
	var oXML = new FCKXml() ;
	var sEncoder = document.location.pathname.replace( /[^/]*$/, '' ) + 'fck_link/encoder.php' ;
	oXML.LoadUrl( sEncoder + '?str=' + str + '&to=' + enc_to + '&from=' + enc_from ) ;

	var oEncodedNode = oXML.SelectSingleNode( 'Encoder' ) ;

	if ( oEncodedNode )
		return oEncodedNode.attributes.getNamedItem('code').value ;

	alert( '文字コードの変換ができません。' ) ;

	return '' ;
}

...

JavaScript から PHP の関数を呼び出す」への6件のフィードバック

  1. 私、阿部と申します。

    いつも貴重な情報をご掲載頂きありがとうございます。
    どの記事も大変参考になりっております。

    「JavaScript から PHP の関数を呼び出す」の記事を
    本日拝見させて頂きまして
    2点修正箇所を見つけましたので、ご連絡いたします。
    以下、内容ご確認頂ければ幸いです。
    本記事も2007年と古い記事かと思いますので
    修正等に関してはご判断くださいますようお願い申し上げます。

    ①(1) FCKeditor/editor/dialog/fck_link.js に fckxml.js をコピーの箇所
    「FCKeditor/editor/dialog/fck_link.js に fckxml.js をコピー」

    「FCKeditor/editor/dialog/fck_link/ に fckxml.js をコピー」
    かと思いました。

    ②(4) FCKeditor/editor/dialog/fck_link/fck_link.js (修正) の箇所
    「var sEncoder = document.location.pathname.replace( /[^/]*$/, ” ) + ‘fck_link/encoder.php’ ;」

    「var sEncoder = document.location.pathname.replace( /[^/]*$/, ” ) + ‘fck_link/encoding.php’ ;」
    かと思いました。

    よろしくお願いいたします。

  2. ご指摘ありがとうございます。

    阿部さんは、とても真面目なお方とお見受けいたしました。
    文章からお人柄がにじみ出ておられます。

    至らないブログですが、今後もよろしくお願い致します。

    さて、調べ直したところ、記事にする際に以下の誤りががありましたので修正いたしました。

    <誤>
    (1) FCKeditor/editor/dialog/fck_link.js に fckxml.js をコピー

    (3) FCKeditor/editor/dialog/fck_link/encodingphp (新規作成)

    <正>
    (1) FCKeditor/editor/dialog/fck_link/ に fckxml.js をコピー

    (3) FCKeditor/editor/dialog/fck_link/encoder.php (新規作成)

    • こんにちは
      阿部です。

      早速のご対応ありがとうございました。

      私もFCKEditor 使っていますが、
      色々と分からない点があり、非常に参考になっております。

      こちらの方こそ今後ともよろしくお願いします。

      • 度々すみません。
        阿部です。

        掲載の手順により
        無事、SJIS対応のmailto の作成ができましたが
        エディタ内のリンクの箇所を右クリック「リンク編集」押下時に
        ハイパーリンク情報を表示できない問題がありました。

        あきらさんのソースを参考にして
        対応してみました(と、言っても単純に逆の流れのものを作っただけですが)ので、
        参考までにご連絡しようとしたのですが、
        このフォームで登録できませんでした。

        差し支えなければ、あきらさんのメールアドレスをご連絡頂ければ
        対応内容についてご連絡させて頂きます。

        尚、あきらさんのメールアドレスに関しては
        本件のご連絡のみに使わせて頂く所存です。

        よろしくお願いいたします。

          • メール返信させて頂きました。
            詳細につきましては、メールご確認ください。

            よろしくお願いいたします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください