簡體   English   中英

生成 UTF-8 字符列表

[英]Generate UTF-8 character list

我有一個 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 中的字符轉換為“<U+####>”語法。 然后,您可以在輸出中搜索這些內容。

如果您的數據將由處理 C 樣式轉義 (\\u####) 的內容讀取,您還可以使用:

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

對於此用例,所有 Unicode 字符的詳盡列表似乎相當不切實際。 非拉丁文字中有數以萬計的字符,它們在 Latin-1 中沒有任何明顯的近等值。

相反,可能會尋找從不是 Latin-1 的拉丁字符到相應的同形異義詞或近似等價詞的映射。

一些編程語言為此提供了現有的庫; 一個常見且簡單的轉換是嘗試從無法用 Latin-1 表示的字符中去除任何重音符號,如果可行,則使用無重音變體。 (不過,您需要保留可以標准化為 Latin-1 的任何字符的重音。也許還可以閱讀有關 Unicode normalization 的信息。)

這是一個快速而骯臟的 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM