Python 无法将大写字母转换为'ß';(德语字符称为eszett)

Python 无法将大写字母转换为'ß';(德语字符称为eszett),python,unicode,utf-8,character-encoding,Python,Unicode,Utf 8,Character Encoding,您好,我必须将字符串列转换为大写版本,但是当字符串中出现“ß”时,它会在执行大写时更改为“SS” 我理解这是因为,早期的“SS”被认为是“ß”的大写字母。但在2017年,“SS”和大写字母“ß”都是允许的 它的unicode版本也可以使用 我对此有以下问题: 为什么python不将其转换为大写字母“ß” 是不是因为python中嵌入了unicode标准?如何知道使用的是哪种unicode标准python/jupyter笔记本 python中是否有大写字母“ß”而不是“SS”的用法 这也是许

您好,我必须将字符串列转换为大写版本,但是当字符串中出现“ß”时,它会在执行大写时更改为“SS” 我理解这是因为,早期的“SS”被认为是“ß”的大写字母。但在2017年,“SS”和大写字母“ß”都是允许的

它的unicode版本也可以使用

我对此有以下问题:

  • 为什么python不将其转换为大写字母“ß”

  • 是不是因为python中嵌入了unicode标准?如何知道使用的是哪种unicode标准python/jupyter笔记本

  • python中是否有大写字母“ß”而不是“SS”的用法


  • 这也是许多其他语言中的行为,您可以这样处理:

    my_string.replace('ß', 'ẞ').upper()
    

    这也是许多其他语言中的行为,您可以这样处理:

    my_string.replace('ß', 'ẞ').upper()
    

    各种Python版本都使用特定的Unicode版本。例如,我认为最初的Python
    3.7
    使用了Unicode
    10.0.0
    ,虽然它有可用的字母(我相信它是从Unicode
    5.1
    开始使用的),但仍然列出了旧的上/下映射:

    00DF ß LATIN SMALL LETTER SHARP S
        = Eszett
        - German
        - uppercase is "SS"
        - nonstandard uppercase is 1E9E ẞ
    1E9E ẞ LATIN CAPITAL LETTER SHARP S
        - lowercase is 00DF ß
    
    即使是在回答此问题时的最新标准,
    13.0.0
    (尽管此更改是在
    11.0.0
    中进行的),似乎也允许自由决定如何将下限转换为上限:

    00DF ß LATIN SMALL LETTER SHARP S
        = Eszett
        - German
        - not used in Swiss High German
        - uppercase is "SS" or 1E9E ẞ
    1E9E ẞ LATIN CAPITAL LETTER SHARP S
        - not used in Swiss High German
        - lowercase is 00DF ß
    
    下表将某些Python版本映射到Unicode版本:

     Python     Unicode
    --------    -------
       3.5.9      8.0.0
      3.6.11      9.0.0
       3.7.8     11.0.0
    3.8.4rc1     12.1.0
     3.9.0b4     13.0.0
    3.10.0a0     13.0.0
    
    因此,您可能需要等待更高版本的Unicode(以及使用该Unicode版本的Python),其中的映射比
    大写字母为“SS”或1E9E的映射要少一些ẞ“
    。但事实上,这可能会被以下条款所排除:

    如果两个字符在Unicode版本中形成一个大小写对,则它们将在每个后续版本的Unicode中保持大小写对。如果两个字符在Unicode版本中不形成大小写对,则它们将永远不会成为任何后续版本的Unicode中的大小写对

    您可以从新引入的字符创建大小写对,假设您要配对的字符尚未配对,但此处不允许,因为:

    • 这个“新”字符早在Unicode 5.1中就引入了;以及
    • 我们要与之配对的角色已配对
    我对这一点的理解使我相信,在不违反该政策的情况下解决这一问题的唯一方法是在一个案例对中引入两个新字符,类似于:

    ß LATIN SMALL LETTER SHARP S THAT IS LOWER OF ẞ
    ẞ LATIN CAPITAL LETTER SHARP S THAT IS UPPER OF ß
    
    to_be_uppered.replace('ß', 'ẞ').upper()
    to_be_lowered.replace('ẞ', 'ß').lower()
    
    然而,我不确定这是否能通过Unicode联盟的愚蠢过滤器:-)

    对于即时修复,您可以在应用内置大小写更改之前,简单地将特定字符强制为您想要的任何字符,例如:

    ß LATIN SMALL LETTER SHARP S THAT IS LOWER OF ẞ
    ẞ LATIN CAPITAL LETTER SHARP S THAT IS UPPER OF ß
    
    to_be_uppered.replace('ß', 'ẞ').upper()
    to_be_lowered.replace('ẞ', 'ß').lower()
    

    后者似乎是不必要的,至少在我的版本Python 3.8.2上是这样。我将其包括在内,以防较早的Python版本可能需要它。甚至可能值得将其放入自定义
    my_upper()
    my_lower()
    函数,如果发现有更多类似的情况需要处理。

    各种Python版本都使用特定的Unicode版本。例如,我认为最初的Python
    3.7
    使用了Unicode
    10.0.0
    ,虽然它有可用的字母(我相信它是从Unicode
    5.1
    开始使用的),仍然列出旧的上/下映射:

    00DF ß LATIN SMALL LETTER SHARP S
        = Eszett
        - German
        - uppercase is "SS"
        - nonstandard uppercase is 1E9E ẞ
    1E9E ẞ LATIN CAPITAL LETTER SHARP S
        - lowercase is 00DF ß
    
    即使是在回答此问题时的最新标准,
    13.0.0
    (尽管此更改是在
    11.0.0
    中进行的),似乎也允许自由决定如何将下限转换为上限:

    00DF ß LATIN SMALL LETTER SHARP S
        = Eszett
        - German
        - not used in Swiss High German
        - uppercase is "SS" or 1E9E ẞ
    1E9E ẞ LATIN CAPITAL LETTER SHARP S
        - not used in Swiss High German
        - lowercase is 00DF ß
    
    下表将某些Python版本映射到Unicode版本:

     Python     Unicode
    --------    -------
       3.5.9      8.0.0
      3.6.11      9.0.0
       3.7.8     11.0.0
    3.8.4rc1     12.1.0
     3.9.0b4     13.0.0
    3.10.0a0     13.0.0
    
    因此,您可能需要等待更高版本的Unicode(以及使用该Unicode版本的Python),其中的映射比
    大写字母为“SS”或1E9E的映射要少一些ẞ"。但事实上,这可能被以下部分内容所阻止:

    如果两个字符在Unicode版本中形成一个大小写对,则它们将在每个后续版本的Unicode中保持大小写对。如果两个字符在Unicode版本中不形成大小写对,则它们将永远不会成为任何后续版本的Unicode中的大小写对

    您可以从新引入的字符创建大小写对,假设您要配对的字符尚未配对,但此处不允许,因为:

    • 这个“新”字符早在Unicode 5.1中就引入了;以及
    • 我们要与之配对的角色已配对
    我对这一点的理解使我相信,在不违反该政策的情况下解决这一问题的唯一方法是在一个案例对中引入两个新字符,类似于:

    ß LATIN SMALL LETTER SHARP S THAT IS LOWER OF ẞ
    ẞ LATIN CAPITAL LETTER SHARP S THAT IS UPPER OF ß
    
    to_be_uppered.replace('ß', 'ẞ').upper()
    to_be_lowered.replace('ẞ', 'ß').lower()
    
    然而,我不确定这是否能通过Unicode联盟的愚蠢过滤器:-)

    对于即时修复,您可以在应用内置大小写更改之前,简单地将特定字符强制为您想要的任何字符,例如:

    ß LATIN SMALL LETTER SHARP S THAT IS LOWER OF ẞ
    ẞ LATIN CAPITAL LETTER SHARP S THAT IS UPPER OF ß
    
    to_be_uppered.replace('ß', 'ẞ').upper()
    to_be_lowered.replace('ẞ', 'ß').lower()
    
    后者似乎是不必要的,至少在我的版本Python 3.8.2上是这样。我将其包括在内,以防较早的Python版本可能需要它。如果发现有更多类似的情况需要处理,甚至值得将其放入custome
    my_upper()
    my_lower()
    函数中。

    应用(+1):

    由于Unicode文档中存在某种政治正确性,我看不到任何其他解决方案:

    • 发件人:

    • 答:不是。UnicodeData.txt文件包含所有的一对一大小写映射。由于许多解析器的构建都希望UnicodeData.txt在每个大小写映射字段中最多只有一个字符,因此添加了SpecialCasing.txt文件以提供一对多映射,例如大写字母ß所需的映射(U+00DF拉丁文小写字母夏普S)。此外,casepolding.txt还包含其他mapp