【问题标题】:Generate UTF-8 character list生成 UTF-8 字符列表
【发布时间】:2021-09-24 09:21:12
【问题描述】:

我有一个 UTF-8 文件,在将文件发送到不理解 UTF-8 的消费系统之前,我将其转换为 ISO-8859-1。我们当前的问题是,当我们在 UTF-8 文件上运行 iconv 进程时,一些字符被转换为“?”。目前,对于每个失败的角色,我们一直在提供修复。 我想了解是否可以创建一个包含所有可能的 UTF-8 字符的文件?目的是使用 iconv 降级它们并识别被替换为“?”的字符

【问题讨论】:

标签: utf-8 iso-8859-1 unicode-string iso-8859-2


【解决方案1】:

所有 Unicode 字符的详尽列表对于这个用例来说似乎相当不切实际。非拉丁文字中有数以万计的字符在 Latin-1 中没有任何明显的近似等效字符。

相反,可能会寻找从不在 Latin-1 中的拉丁字符到对应的同形异义词或近似等价物的映射。

一些编程语言为此提供了现有的库;一个常见且简单的转换是尝试从无法用 Latin-1 表示的字符中去除任何重音,如果可行,则使用无重音变体。 (不过,您需要保留任何可以规范化为 Latin-1 的字符的重音。也许还可以阅读有关 Unicode 规范化的信息。)

这是一个快速而肮脏的 Python 尝试。

from unicodedata import normalize

def latinize(string):
    """
    Map string to Latin-1, replacing characters which can be approximated
    """
    result = []
    for char in string:
        try:
            byte = normalize("NFKC", char).encode('latin-1')
        except UnicodeEncodeError:
            byte = normalize("NFKD", char).encode('ascii', 'ignore')
        result.append(byte)
    return b''.join(result)

def convert(fh):
    for line in fh:
        print(latinize(line), end='')

def main():
    import sys
    if len(sys.argv) > 1:
        for filename in sys.argv[1:]:
            with open(filename, 'r') as fh:
                convert(fh)
    else:
        convert(sys.stdin)

if __name__ == '__main__':
    main()

演示:https://ideone.com/sOEBW9

【讨论】:

    【解决方案2】:

    我建议不要查看每个可能的 Unicode 字符(超过 140k 个),而是执行 iconv 替换,然后查看实际问题出在哪里。例如:

    iconv -f UTF-8 -t ISO-8859-1 --unicode-subst="<U+%04X>"
    

    这会将不在 ISO-8859-1 中的字符转换为“”语法。然后,您可以在输出中搜索这些。

    如果您的数据将被处理 C 样式转义 (\u####) 的东西读取,您也可以使用:

    iconv -f UTF-8 -t ISO-8859-1 --unicode-subst="\\u%04x"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 2015-06-02
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      相关资源
      最近更新 更多