[英]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.