おおたにです。

初期化引数に日本語を渡す場合と、そうでない場合での動作の違いはよくわかり
ません。(すみません)

UnicodeColを使う場合、文字列はunicodeで渡す必要があります。TurboGearsで
普通に(?)に作る場合、CGIパラメータの値はUTF-8で渡されるので、これを
Unicodeに変換する必要があります。Unicodeへの変換は、フィルタを使って変換
する方法とvalidatorで変換する方法がありますが、これらは説明がちょっと長
くなるので、単純にdata = data.decode("utf-8")みたいにしてみてはどうで
しょう?


odagiri atsushi wrote:
> 小田切です。
> 
> http://d.hatena.ne.jp/aodag でBlog作成のサンプルコードを書いています。
> その中で、UnicodeColを使用中に不思議な現象に会いました。
> 
> class Comment(SQLObject):
>     date = DateCol()
>     data = UnicodeCol(default=None)
>     author = UnicodeCol(default=None)
>     blog = ForeignKey("Blog")
> 
> 上記モデルに対して、以下のコードでモデル作成をするとエラーになります。
> エラー発生時のdata, authorの内容が日本語の場合です。
> アルファベットなどの場合はエラーになりませんでした。
>       hub.begin()
>       try:
>           c = Comment(date=date.today(), blogID=blogId, data=data,. 
> author=author)
>           hub.commit()
>       except:
>           hub.rollback()
>           raise
>       hub.end()
> 
> エラー時のtracebackは以下のとおりです。
> Traceback (most recent call last):
>   File 
> "c:\python24\lib\site-packages\CherryPy-2.2.1-py2.4.egg\cherrypy\_cphttptools.py",
> line 105, in _run
>     self.main()
>   File 
> "c:\python24\lib\site-packages\CherryPy-2.2.1-py2.4.egg\cherrypy\_cphttptools.py",
> line 254, in main
>     body = page_handler(*virtual_path, **self.params)
>   File "<string>", line 3, in addComment
>   File 
> "c:\python24\lib\site-packages\TurboGears-0.9a6-py2.4.egg\turbogears\controllers.py",
> line 273, in expose
>     output = database.run_with_transaction(
>   File 
> "c:\python24\lib\site-packages\TurboGears-0.9a6-py2.4.egg\turbogears\database.py",
> line 221, in run_with_transaction
>     retval = func(*args, **kw)
>   File "<string>", line 5, in _expose
>   File 
> "c:\python24\lib\site-packages\TurboGears-0.9a6-py2.4.egg\turbogears\controllers.py",
> line 290, in <lambda>
>     mapping, fragment, *args, **kw)))
>   File 
> "c:\python24\lib\site-packages\TurboGears-0.9a6-py2.4.egg\turbogears\controllers.py",
> line 314, in _execute_func
>     output = errorhandling.try_call(func, *args, **kw)
>   File 
> "c:\python24\lib\site-packages\TurboGears-0.9a6-py2.4.egg\turbogears\errorhandling.py",
> line 71, in try_call
>     return func(self, *args, **kw)
>   File "C:\works\blog\blog\controllers.py", line 94, in addComment
>     c = Comment(date=date.today(), blogID=blogId, data=data, author=author)
>   File 
> "c:\python24\lib\site-packages\SQLObject-0.7.1dev_r1457-py2.4.egg\sqlobject\main.py",
> line 1197, in __init__
>     self._create(id, **kw)
>   File 
> "c:\python24\lib\site-packages\SQLObject-0.7.1dev_r1457-py2.4.egg\sqlobject\main.py",
> line 1224, in _create
>     self._SO_finishCreate(id)
>   File 
> "c:\python24\lib\site-packages\SQLObject-0.7.1dev_r1457-py2.4.egg\sqlobject\main.py",
> line 1248, in _SO_finishCreate
>     id, names, values)
>   File 
> "c:\python24\lib\site-packages\SQLObject-0.7.1dev_r1457-py2.4.egg\sqlobject\dbconnection.py",
> line 752, in queryInsertID
>     return self._dbConnection._queryInsertID(
>   File 
> "c:\python24\lib\site-packages\SQLObject-0.7.1dev_r1457-py2.4.egg\sqlobject\sqlite\sqliteconnection.py",
> line 103, in _queryInsertID
>     q = self._insertSQL(table, names, values)
>   File 
> "c:\python24\lib\site-packages\SQLObject-0.7.1dev_r1457-py2.4.egg\sqlobject\sqlite\sqliteconnection.py",
> line 121, in _insertSQL
>     return DBAPI._insertSQL(self, table, names, values)
>   File 
> "c:\python24\lib\site-packages\SQLObject-0.7.1dev_r1457-py2.4.egg\sqlobject\dbconnection.py",
> line 349, in _insertSQL
>     return ("INSERT INTO %s (%s) VALUES (%s)" %
> UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position
> 1: ordinal not in range(128)
> 
> エラー内容からするとasciiコードへの変換をしてしまっているようです。
> この動作によって、日本語を使用するとエラーになることはわかりますが、なぜこの動作をするのかがわかりません。
> 
> 以下のようにするとエラーになりません。
>       hub.begin()
>       try:
>           c = Comment(date=date.today(), blogID=blogId)
>           c.data=data
>           c.author=author
>           hub.commit()
>       except:
>           hub.rollback()
>           raise
>       hub.end()
> 
> INSERT文生成時に日本語が入っていなければエラーとならないのですが、
> Commentクラス以外のUnicodeColを使用したモデルではこのような現象が発生していません。
> UnicodeCol使用にあたって設定する部分があるのでしょうか。
> 
> 

--~--~---------~--~----~------------~-------~--~----~
これは、お客様が次の Google グループに申し込まれたことを確認するメッセー
ジです。 Google Groups "turbogears-ja" group.
 To post to this group, send email to [email protected]
 このグループから退会するには、次へメールをお送りください。 [EMAIL PROTECTED]
 For more options, visit this group at 
http://groups.google.com/group/turbogears-ja
-~----------~----~----~----~------~----~------~--~---

メールによる返信