【问题标题】:List of unicode character namesUnicode 字符名称列表
【发布时间】:2015-05-18 12:04:38
【问题描述】:

在 Python 中,我可以按名称打印 unicode 字符(例如 print(u'\N{snowman}'))。有没有办法获得所有有效名称的列表?

【问题讨论】:

  • 那将是整个 Unicode 标准
  • 你为什么要问这个问题?
  • @MikeGraham 想和我的学生玩个小游戏。
  • 请注意,如果他们使用不同版本的 Python,游戏可能会适得其反:请参阅 Martijn Pieters' answer below

标签: python unicode


【解决方案1】:

如果您想要所有 Unicode 字符名称的列表,请考虑下载Unicode Character Database

它包含在许多 Linux 发行版的基础存储库中(例如 RHEL 上的“unicode-ucd”)。

该软件包包括NamesList.txt,其中包含详尽的 unicode 字符名称列表。

注意:NamesList.txt 需要多次下载(大小 > 1.5 MB)。

例子:

21FE    RIGHTWARDS OPEN-HEADED ARROW
21FF    LEFT RIGHT OPEN-HEADED ARROW
@@  2200    Mathematical Operators  22FF
@@+
@       Miscellaneous mathematical symbols
2200    FOR ALL
    = universal quantifier
2201    COMPLEMENT
    x (latin letter stretched c - 0297)
2202    PARTIAL DIFFERENTIAL
2203    THERE EXISTS
    = existential quantifier
2204    THERE DOES NOT EXIST
    : 2203 0338
2205    EMPTY SET
    = null set
    * used in linguistics to indicate a null morpheme or phonological "zero"
    x (latin capital letter o with stroke - 00D8)
    x (diameter sign - 2300)
    ~ 2205 FE00 zero with long diagonal stroke overlay form

【讨论】:

    【解决方案2】:

    每个代码点都有一个名称,因此您实际上是在请求Unicode standard list of codepoint names(以及*list of name aliases,Python 3.3 及更高版本支持)。

    每个 Python 版本都支持特定版本的 Unicode 标准; unicodedata.unidata_version attribute 告诉你哪个是给定的 Python 运行时。以上链接指向最新发布的 Unicode 版本,请将 URL 中的 UCD/latest 替换为您的 Python 版本的 unicodedata.unidata_version 值。

    对于每个代码点,unicodedata.name() function 可以告诉您正式名称,unicodedata.lookup() 为您提供相反的名称(代码点的名称)。

    【讨论】:

    • 谢谢。我认为可能会有反向查找 name -> unichr 但我想没有。
    • @lazy1: 你是说unicodedata.lookup()?
    • lookup 只是为了一个,我想要整个列表。我的评论措辞不好:(
    • 这里只需要吹毛求疵,因为字符名称列表只是“整个 Unicode 标准”的一小部分。大量元数据和大量附录解释了许多复杂的文本相关算法,也是标准的一部分。
    • @JoachimSauer:同意,我提供了更好的链接。
    【解决方案3】:

    全部打印出来:

    import unicodedata 
    
    for i in range(0x110000): 
        character = chr(i) 
        name = unicodedata.name(character, "") 
        if len(name) > 0: 
            print(f"{i:6} | 0x{i:04X} | {character} | {name}") 
    

    【讨论】:

      【解决方案4】:

      是的,有办法。遍历所有现有代码点并在每个代码点上调用 unicodedata.name()。像这样:

      names = []
      for c in range(0, 0x10FFFF + 1):
          try:
              names.append(unicodedata.name(c))
          except KeyError:
              pass
      # Do something with names
      

      【讨论】:

        【解决方案5】:

        对于给定的代码点,您可以使用unicodedata.name。要获得所有这些名称,您可以查看所有数十亿,看看哪些有这样的名字。

        【讨论】:

        • 不是数十亿。标准并没有那么那么大。然而。 Unicode 7.0 包含 112,804。
        • 没有数十亿个名字,但有数十亿个潜在的代码点需要处理并检查我们是否天真地前进。
        • 确实有(并且永远会有)1,114,112 个潜在的代码点。你必须非常天真才能走遍整个 32 位空间。
        【解决方案6】:

        如果您想按名称插入 unicode 字符,但不知道名称。以下是您轻松了解 unicode 字符名称的方法。

        在 Windows 上

        1. 打开“Character Map”(搜索charmap.exe 并运行它)。
        2. 选择任何常见的 Microsoft 字体(这些字体往往定义了多种 unicode 字符)。
        3. 单击地图上的任何字符以获取其 Unicode 字符名称。

        在 Mac 上称为“字符调色板”,可在系统偏好设置、“国际 -> 输入”或“语言和文本 -> 输入源”下通过勾选“字符调色板”旁边的框找到.

        【讨论】:

          【解决方案7】:

          我的一个班轮,仅供我自己参考;p

          import unicodedata
          names = [unicodedata.name(chr(c)) for c in range(0, 0x10FFFF+1) if unicodedata.name(chr(c), None)]
          

          【讨论】:

            猜你喜欢
            • 2020-10-16
            • 1970-01-01
            • 2020-10-23
            • 2017-04-14
            • 1970-01-01
            • 1970-01-01
            • 2017-12-12
            • 1970-01-01
            相关资源
            最近更新 更多