概要
- Django を利用した Webアプリを作った際、日本語を POST した。
- Django 側が受け取った時、文字列は unicode になっている。それを含めた decode 処理をする必要あり。
環境
- システム全体を通しての文字コードは utf-8 。
- Backend ( WebAPI ) は Django 1.6 で作成。
- Frontend は Django を使わず、純粋な HTML + Javascript で作成。
該当機能
- Frontend 側で、ユーザが日本語のコメントを入力し、それを backend 側で保存する。
- あとで frontend の別画面に表示。
Frontend 側実装 ( Javascript )
- 日本語を POST する処理。
- jQuery の「$.ajax」を使用。エラー時のコールバックも ( 一応 ) 欲しいので。
- 日本語は「encodeURIComponent( ... )」で encode する必要あり。
- 以下、サンプル。
- 「$.ajax」は ( 自分が ) 使い易いようにラップ。「_ajax」。
- 実際に実行するのは、「postMessage」。
var _webapi_post_message = '<webapi url>';
var postMessage = function( message, success, failure ) {
var data = {};
data.message = encodeURIComponent( message );
_ajax( _webapi_post_message, 'POST', data, success, failure );
};
var _ajax = function( url, method, send_data, success, failure ) {
$.ajax( {
url : url,
type : method,
data : send_data,
cache : false,
dataType : 'json',
success : function( data, dataType ) {
if ( success != null ) {
success( data, dataType );
}
},
error : function( XMLHttpRequest, textStatus, errorThrown ) {
if ( failure != null ) {
failure( XMLHttpRequest, textStatus, errorThrown );
}
}
} );
};
Backend 側実装 ( Python ( Django ) )
- 受け取ったパラメータは encode されているので、それを decode する。
- ただし、受け取った文字列は unicode なので、一度 utf-8 に変換して decode 。
- 引き続き Python で処理するため、decode したら再び unicode に戻す。
- 以下、サンプル。views.py。
- 「postMessage」が Frontend からのデータを受け付けて処理。
- 「__unquote」で、文字列の変換処理をしている。
import urllib2
def __unquote( message ) :
'''
( encodeURIComponent された ) 入力 message を unquote して返します。
@param message : 入力メッセージ。unicode 文字列。
@return : unquote したメッセージ。unicode 文字列。
'''
_message = message.encode( 'utf-8', 'ignore' )
_message = urllib2.unquote( _message )
_message = _message.decode( 'utf-8' )
return _message
def postMessage( request ) :
'''
投稿されたメッセージを処理します。
@param : request
@return : HttpResponse
'''
message = request.POST.get( 'message', '' )
message = __unquote( message )