おおたにです。
初期化引数に日本語を渡す場合と、そうでない場合での動作の違いはよくわかり
ません。(すみません)
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
-~----------~----~----~----~------~----~------~--~---