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 '' ;
}

...

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 (新規作成)

    1. こんにちは
      阿部です。

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

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

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

      1. 度々すみません。
        阿部です。

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

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

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

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

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

        1. コメント送信時のメールアドレスへ連絡いたしました。

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

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

コメントする

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

*

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