【问题标题】:in a python 3 string from another program, ü is two characters, the u and the umlaut. Why? [duplicate]在另一个程序的 python 3 字符串中,ü 是两个字符,u 和变音符号。为什么? [复制]
【发布时间】:2020-08-28 16:22:28
【问题描述】:

我从 php 7 程序中获取一个字符串,并在 Python 3.7.2 中处理它。

my_str = 'ü'

print(type(my_str))

str_list = list(my_str)

for letter in str_list:
    print('letter',letter)

if 'ü' in my_str:
    print('we have the umlaut')
else:
    print('we have no umlaut')

这是输出:

<class 'str'>
letter u
letter ̈
we have no umlaut

为什么字母 u 与变音符号分开?如果我在此字符串中键入 ü,它会被读取为 'ü',并且对 'ü' 的测试成功。如何更正此字符串,使其具有 ü 而不是两个单独的字符?

提前感谢您提供的任何提示。我已经搜索过这个并没有发现任何有用的信息。

【问题讨论】:

  • 欢迎来到非间距 unicode 字符的世界!它是COMBINING DIAERESIS
  • 您可以像stackoverflow.com/questions/16467479/normalizing-unicode 一样规范化字符串。 'ü' in unicodedata.normalize('NFC', my_str)True
  • 对于遇到此类 unicode 问题的其他人,我得到了十六进制字符序数 - hex(ord(my_str[1])) 然后在互联网上搜索“unicode U+0308”以获取有关该字符的详细信息。
  • 这是一个很好的问题。我们中有多少人在使用之前对我们的 unicode 数据进行规范化?手? (我承认,我没有)。但它是一个微妙的错误来源。
  • @tdelaney 还有unicodedata.name(my_str[1])

标签: python character-encoding diacritics


【解决方案1】:

字符串中的字符和条件中的字符具有不同的表示形式:

from unicodedata import name, normalize


my_str = 'ü'
for c in my_str:
    print(name(c))

# LATIN SMALL LETTER U
# COMBINING DIAERESIS

your_u = 'ü'  # copy pasted from your 'if ...' line
for c in your_u:
    print(name(c))

# LATIN SMALL LETTER U WITH DIAERESIS

你可以标准化你的字符串:

my_normalized_str = normalize('NFC', my_str)

for c in my_normalized_str:
    print(name(c))

#LATIN SMALL LETTER U WITH DIAERESIS

现在您的比较将按预期进行:

if 'ü' in my_normalized_str:
    print('we have the umlaut')
else:
    print('we have no umlaut')

# we have the umlaut

【讨论】:

  • 哇。这就是答案!谢谢@Thierry Lathuille,以及评论者 tdelaney 和 snakecharmerb。我的世界变得更大了。 :-)
猜你喜欢
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 2018-08-10
  • 2020-03-21
  • 2012-10-07
  • 2015-03-21
相关资源
最近更新 更多