UTF-8和鞋帮()

Hel*_*nar 9 python case-sensitive

我想使用内置函数(如upper()和capitalize())转换UTF-8字符串.

例如:

>>> mystring = "i??ü?"
>>> print mystring.upper()
I??ü?  # should be ???ÜI instead.
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

Ign*_*ams 14

不要对编码的字符串执行操作; unicode首先解码.

>>> mystring = "i??ü?"
>>> print mystring.decode('utf-8').upper()
I??ÜI
Run Code Online (Sandbox Code Playgroud)

  • 该答案产生的输出(IŞĞÜI,以 U+0049 LATIN CAPITAL LETTER I 开头)与问题提供的正确输出(IŞĞÜI,以 U+0130 LATIN CAPITAL LETTER I 开头,上面有点)不同。 (2认同)

Ale*_*lli 9

作为一般策略,最好始终将文本保留为内存中的Unicode:在输入时对其进行解码,并在需要输出时准确编码,如果在输入时有特定的编码要求和/或输入时间.

即使您不选择采用这种一般策略(并且您应该!),执行所需任务的唯一合理方法仍然是再次进行解码,处理,编码 - 永远不要对编码形式起作用.即:

mystring = "i??ü?"
print mystring.decode('utf-8').upper().encode('utf-8')
Run Code Online (Sandbox Code Playgroud)

假设您在赋值和输出时受限于编码字符串.(不幸的是,输出约束是现实的,分配约束不是 - 只是这样做mystring = u"i??ü?",从一开始就使它成为unicode,至少保存自己的.decode调用! - )

  • 对于日期/时间,相同的状态是个好主意.输入后立即转换为UTC(或至少TZ识别),并在输出时返回正确的时区.这解决了一系列不同时区和夏令时的问题. (3认同)