【问题标题】:Determine if a unicode character exists in a unicode subset确定 unicode 字符是否存在于 unicode 子集中
【发布时间】:2019-12-18 00:12:11
【问题描述】:

我想找到一种方法来确定 Unicode 字符是否存在于 Unicode 字符的标准化子集中,特别是 Latin basic 和 Latin-1。我正在使用 Python 2 和 unicodedata 模块,但需要一个也适用于 3 的解决方案,因为我的工作很快就会升级。

我目前的想法是使用 Unicode Scripts.txt 文件并将其解析为某种字典以进行搜索。问题是该文件中 Unicode 代码的格式是这样的。

02B9..02C1

和python中的Unicode点是这样的

`u'\xe6'

我不知道如何比较这两件事。我猜它是十六进制的,而 Python 的表示只是表示十六进制的另一种方式。

是否有任何现有的 Unicode 子集及其字符的 JSON 数据集可供我参考?谷歌搜索一无所获。由于数据集相对较小,最好只从维基百科页面制作一个?

【问题讨论】:

    标签: python unicode hex python-unicode python-module-unicodedata


    【解决方案1】:

    02B9 .. 02C1 是这些字符的十六进制代码点。使用unicodedata.name 可以获得他们的名字:

    import unicodedata 
    for i in range(int('02b9', 16), int('02c1', 16) + 1): 
        char = chr(i) 
        print(hex(i), char, unicodedata.name(char))  
    
    
    0x2b9 ʹ MODIFIER LETTER PRIME
    0x2ba ʺ MODIFIER LETTER DOUBLE PRIME
    0x2bb ʻ MODIFIER LETTER TURNED COMMA
    0x2bc ʼ MODIFIER LETTER APOSTROPHE
    0x2bd ʽ MODIFIER LETTER REVERSED COMMA
    0x2be ʾ MODIFIER LETTER RIGHT HALF RING
    0x2bf ʿ MODIFIER LETTER LEFT HALF RING
    0x2c0 ˀ MODIFIER LETTER GLOTTAL STOP
    0x2c1 ˁ MODIFIER LETTER REVERSED GLOTTAL STOP
    

    如果您想知道它们是否是 Latin-1 的子集,您可以try 将它们转换为该(或任何其他)编码:

    import unicodedata 
    for i in range(int('02b9', 16), int('02c1', 16) + 1): 
        char = chr(i) 
        try:
            char.encode('latin1')
        except UnicodeEncodeError:
            print(char, False)
        else:
            print(char, True)
    

    它们都将返回 False,因为它们不是 Latin1 的子集。

    【讨论】:

    • 我不知道你可以通过这样的子集对字符进行编码。我认为这足以让我走上正轨。谢谢
    • @rustinpeace91 没有正式命名为“unicode 子集”这样的东西,这个术语充其量是模棱两可的。掌握字符编码的重要概念 - 我强烈建议阅读 joelonsoftware.com/2003/10/08/…
    猜你喜欢
    • 1970-01-01
    • 2017-07-21
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2011-08-15
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多