如何解决生成 UTF-8 字符列表
我有一个 UTF-8 文件,在将文件发送到不理解 UTF-8 的消费系统之前,我将其转换为 ISO-8859-1。我们当前的问题是,当我们在 UTF-8 文件上运行 iconv 进程时,某些字符会被转换为“?”。目前,对于每个失败的角色,我们一直在提供修复。 我想了解是否可以创建一个包含所有可能的 UTF-8 字符的文件?目的是使用 iconv 将它们降级,并识别被 '?' 替换的字符
解决方法
与其查看每个可能的 Unicode 字符(超过 14 万个),我建议执行 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"
,
所有 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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。