Python Unicode和Google App engine SDK日志控制台

Python Unicode和Google App engine SDK日志控制台,python,python-2.7,google-app-engine,logging,unicode,Python,Python 2.7,Google App Engine,Logging,Unicode,这让我抓狂,试图弄清楚我的应用程序是否正确处理了Unicode。 我遇到的一个主要问题是日志控制台似乎没有正确显示unicode字符 for index in range( len( input ) ): logging.info( "ASCII " + str( index ) + ": " + str( input[ index ].encode( errors = 'backslashreplace' ) )

这让我抓狂,试图弄清楚我的应用程序是否正确处理了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 ] ) ) )
通过上面的代码片段,我得到以下日志输出:

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

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

INFO 2015-11-22 16:06:59967init.py:47]UNICODE 1252:ØØ->322

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

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

正如你所看到的,它应该在哪里打印,它实际上是在打印。 这是我对python如何处理unicode的一些基本误解,还是可能是Google app engine sdk中的一个bug,或者仅仅是一个配置错误的设置?

问题在于(根据对原始Q的评论中的进一步讨论)获取一个utf-8字节串并逐字节遍历——从utf-8字符串中提取一个非ASCII字节,从utf-8上下文中删除,这是没有意义的。以OP评论中提供的一个示例为例(使用Python 2.7与AppEngine目前使用的一致):

latin-1解码只是一个技巧,我用它来简洁地说“解释每个字节本身”(因为latin-1是单字节编解码器)

因此,这显示了一个原始的
\u017c
(小写的z上面有一个点)是如何(通过utf-8,然后无意义地逐字节解释)转换成“大写的a上面有一个小圆圈”,然后是其他的东西(在拉丁语-1中恰好是分数“四分之一”)

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

问题在于(根据原始Q评论中的进一步讨论)获取一个utf-8字节串并逐字节遍历——从utf-8字符串中提取一个非ASCII字节,从utf-8上下文中删除,这是没有意义的。以OP评论中提供的一个示例为例(使用Python 2.7与AppEngine目前使用的一致):

latin-1解码只是一个技巧,我用它来简洁地说“解释每个字节本身”(因为latin-1是单字节编解码器)

因此,这显示了一个原始的
\u017c
(小写的z上面有一个点)是如何(通过utf-8,然后无意义地逐字节解释)转换成“大写的a上面有一个小圆圈”,然后是其他的东西(在拉丁语-1中恰好是分数“四分之一”)


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

希望只是一些混淆,让我们来探探一下。什么是
输入
——一串字节?还是unicode字符?如果是后者,
unicode(input[index])
If
input[index]
已经是unicode了?为什么你认为unichr(322)又名u
\u0142
应该是一个带点的小写z(我相信是unichr(380)又名u'\u017c')--我认为它是一个带一个横条的小写l--显然显示的是两个字符,复制并粘贴到Python解释器中的\u00c5后跟一个小逗号标记似乎是\u201a。问题之一是我不完全确定。这个片段是一个更大的应用程序的一部分,该应用程序可以请求有关您在facebook上即将发生的事件的信息。我相信我得到的数据是utf-8,它已经被编码(解码?)以适合json字符串。您可以使用以下波兰语单词作为示例:“pożegnanie”“po\u017cegananie”如果
input
是utf-8中的一个字节字符串,那么以每次增加一个索引的方式遍历它是没有意义的——您得到的单个字节在完整utf-8内容之外没有任何意义。这需要一个代码示例,所以我将把它作为一个答案来展示(代码在注释中不太合适)。什么是
输入
——一串字节?还是unicode字符?如果是后者,
unicode(input[index])
If
input[index]
已经是unicode了?为什么你认为unichr(322)又名u
\u0142
应该是一个带点的小写z(我相信是unichr(380)又名u'\u017c')--我认为它是一个带一个横条的小写l--显然显示的是两个字符,复制并粘贴到Python解释器中的\u00c5后跟一个小逗号标记似乎是\u201a。问题之一是我不完全确定。这个片段是一个更大的应用程序的一部分,该应用程序可以请求有关您在facebook上即将发生的事件的信息。我相信我得到的数据是utf-8,它已经被编码(解码?)以适合json字符串。您可以使用以下波兰语单词作为示例:“pożegnanie”“po\u017cegananie”如果
input
是utf-8中的一个字节字符串,那么以每次增加一个索引的方式遍历它是没有意义的——您得到的单个字节在完整utf-8内容之外没有任何意义。这需要一个代码示例,所以我将以答案(代码)的形式显示它
2>>> s=u"pożegnanie"
2>>> s
u'po\u017cegnanie'
2>>> su=s.encode('utf8')
2>>> su
'po\xc5\xbcegnanie'
2>>> su.decode('latin-1')
u'po\xc5\xbcegnanie'
2>>> print su.decode('latin-1')
pożegnanie