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 の関数を呼び出す」の記事を
本日拝見させて頂きまして
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’ ;」
かと思いました。
よろしくお願いいたします。
ご指摘ありがとうございます。
阿部さんは、とても真面目なお方とお見受けいたしました。
文章からお人柄がにじみ出ておられます。
至らないブログですが、今後もよろしくお願い致します。
さて、調べ直したところ、記事にする際に以下の誤りががありましたので修正いたしました。
<誤>
(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 の作成ができましたが
エディタ内のリンクの箇所を右クリック「リンク編集」押下時に
ハイパーリンク情報を表示できない問題がありました。
あきらさんのソースを参考にして
対応してみました(と、言っても単純に逆の流れのものを作っただけですが)ので、
参考までにご連絡しようとしたのですが、
このフォームで登録できませんでした。
差し支えなければ、あきらさんのメールアドレスをご連絡頂ければ
対応内容についてご連絡させて頂きます。
尚、あきらさんのメールアドレスに関しては
本件のご連絡のみに使わせて頂く所存です。
よろしくお願いいたします。
コメント送信時のメールアドレスへ連絡いたしました。
メール返信させて頂きました。
詳細につきましては、メールご確認ください。
よろしくお願いいたします。