Unicode和谷歌应用程序引擎SDK日志控制台



这让我抓狂,我试图弄清楚我的应用程序是否正确处理了Unicode。我遇到的一个主要问题是日志控制台似乎没有正确显示unicode字符

    for index in range( len( input ) ):
        logging.info(  "ASCII   " + str( index )     +  ": " + str( input[ index ].encode( errors = 'backslashreplace' ) ) +  " -> " + str( ord( input[ index ] ) ) )
        logging.info( u"UNICODE " + unicode( index ) + u": " + unicode( input[ index ] )                                   + u" -> " + unicode( ord( input[ index ] ) ) )

通过上面的片段,我得到了以下日志输出:

信息2015-11-22 16:06:59967init.py:47]UNICODE 1251:M->77

信息2015-11-22 16:06:59967init.py:46]ASCII 1252:\u0142->322

信息2015-11-22 16:06:59967init.py:47]UNICODE 1252:Å->322

信息2015-11-22 16:06:59967init.py:46]ASCII 1253:o->111

信息2015-11-22 16:06:59969init.py:47]UNICODE 1253:o->111

正如你所看到的,它应该在哪里打印ż,它实际上打印Å。这是我对python如何处理unicode的一些根本误解吗,还是可能是谷歌应用程序引擎sdk中的错误,或者只是配置错误?

问题是(根据对原始Q的评论中的进一步讨论),获取一个utf-8字节字符串并逐字节遍历它——从utf-8上下文中拔出的utf-8字符串中的单个非ASCII字节是没有意义的。举一个OP评论中提供的例子(使用Python 2.7与应用程序引擎目前使用的一致性):

2>>> s=u"pożegnanie"
2>>> s
u'pou017cegnanie'
2>>> su=s.encode('utf8')
2>>> su
'poxc5xbcegnanie'
2>>> su.decode('latin-1')
u'poxc5xbcegnanie'
2>>> print su.decode('latin-1')
pożegnanie

latin-1的解码只是我用来紧凑地说"解释每个字节自己"的一个技巧(因为latin-1是一个单字节编解码器)。

因此,这表明了原始u017c(小写z,顶部有一个点)是如何变形的(通过utf-8,然后逐字节进行无意义的解释),变成"大写a,顶部有小圆圈",然后是其他东西(在拉丁语-1中,恰好是分数"四分之一")。

为了明确什么是inputtype(input)repr(input)logging.info(或者其相关切片,例如,如果问题出现在索引1252周围,则为repr(input[1248:1258]))可能会有所帮助。我怀疑SDK很好(但如果不是,这将有助于诊断在公共应用程序引擎问题跟踪器上针对它打开的错误),而问题是unicode与各种编码和解码的字节字符串。

最新更新