XMLHttpRequest を利用してデータをColdFusionにPOSTした際の注意

ColdFusionでは、POSTされたフォーム値をForm変数として受け取る際に、デフォルトのUTF-8か #SetEncoding("Form","MS932")# 関数を使用してエンコードを指定することで、日本語などを含むデータを文字化けすることなく受け取ることができます。

ただし、すべてのPOSTされたデータを上記で処理をするわけではありません。POSTされたデータをForm変数として処理するためには、フォームから送信されたもの。言い換えると enctype が application/x-www-form-urlencoded(デフォルト)や multipart/form-data(アップロードファイルを含むフォーム)でPOSTされたものを上記のように処理を行います。

それ以外の方法でPOSTされたもの、例えば、XMLHttpRequestで、Ajax機能を使用してデータを送信したものについては、上記のような処理は行わないので、送信されたデータをColdFusionではgetHttpRequestData関数やDeserializeJSON関数を使ってデータを構造化して処理を行います。その際に、日本語などの文字を含むJSONデータをColdFusionで受け取った際に文字化けを起こす場合があります。

例えば、以下のコードは、日本語版Windowsでは文字化けを起こします(該当部のみ抜粋)

<script language="javascript" type="text/javascript">
  function OnButtonClick() {
    var xmlhttp = new XMLHttpRequest();
 …
    var t1 = document.getElementById('Text1');
    var t2 = document.getElementById('Text2');
    var jData = '[{"p1":"'+t1.value+'","p2":"'+t2.value+'"}]';

    xmlhttp.open('POST', 'post.cfm');
    xmlhttp.setRequestHeader('Content-Type', 'application/json;');
    xmlhttp.send(jData);
 }
</script>

  <input id="Text1" type="text" value="あいうえお" /><br/>
  <input id="Text2" type="text" value="かきくけこ" /><br />
  <input id="Button1" type="button" value="送信" onclick="OnButtonClick();"/> 

XMLHttpRequestで送信するデータの文字コードはUTF-8で行われるようですが、送信先のColdFusion側では送信元を限定して処理しているわけではないため、送信元からエンコードの指定がない場合には「Javaのデフォルトエンコーディング」を使用して文字を取り扱います。日本語版Windows環境では、「Javaのデフォルトエンコーディング」は MS932(Shift_JIS)となりますので、UTF-8 で送信されたデータを MS932(Shift_JIS)で受け取るために文字化けを起こします。

この状況に遭遇した際は、送信元の XMLHttpRequest の setRequestHeaderで「Content-Type」を指定している値に charsetを付加することで、送信先のColdFusionで文字コードを認識でき、文字化けを解消することができます。

setRequestHeader('Content-Type', 'application/json; charset=UTF-8');


 


記事公開日:2020年07月03日
最終更新日:2020年07月03日


x

Sample Modal Window

This is just a sample…

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent suscipit iaculis libero sed tristique. Quisque mollis dolor non tellus placerat vitae sodales lectus porta. Curabitur ut suscipit tellus. Maecenas rhoncus, ante vitae vehicula vestibulum, metus sapien dapibus tellus, et mattis dolor neque vitae nisl. Nullam eleifend ultrices ipsum eget pretium. Curabitur semper metus ut ante adipiscing nec volutpat sem rutrum. Nullam a nisi lacus, non interdum ante. Vivamus ante augue, commodo vel egestas sed, pharetra nec dui. Quisque sed tellus felis. Donec ipsum mauris, sagittis eu accumsan in, aliquam non ipsum.

Vestibulum tempor nunc nec felis scelerisque eget elementum erat dignissim. Ut vel ipsum mollis orci venenatis luctus. Aenean vehicula quam vel quam porttitor ac iaculis elit pulvinar. Proin consequat, ipsum eu venenatis semper, justo turpis posuere tortor, ac placerat metus nisl et lectus. Nulla cursus dui id nunc ullamcorper sed semper nisl lobortis. Aliquam erat volutpat. Phasellus arcu ante, imperdiet in ornare sed, laoreet eu massa.