如何辨識奇怪的字元?
我正在嘗試辨識在我正在使用的文件中發現的一個奇怪字元:
$ cat file � $ od file 0000000 005353 0000002 $ od -c file 0000000 353 \n 0000002 $ od -x file 0000000 0aeb 0000002
該文件使用 ISO-8859 編碼,無法轉換為 UTF-8:
$ iconv -f ISO-8859 -t UTF-8 file iconv: conversion from `ISO-8859' is not supported Try `iconv --help' or `iconv --usage' for more information. $ iconv -t UTF-8 file iconv: illegal input sequence at position 0 $ file file file: ISO-8859 text
我的主要問題是如何解釋
od
這裡的輸出?我正在嘗試使用此頁面,它可以讓我在不同的字元表示之間進行翻譯,但它告訴我005353
作為“十六進制程式碼點”卓
似乎不正確,而0aeb
作為“十六進制程式碼點”૫
又似乎是錯誤的.那麼,我如何使用三個選項( 或 )中的任何一個
355
來005353
找出0aeb
它們應該代表什麼字元?是的,我確實嘗試過使用 Unicode 工具,但它似乎也不是有效的 UTF 字元:
$ uniprops $(cat file) U+FFFD ‹�› \N{REPLACEMENT CHARACTER} \pS \p{So} All Any Assigned Common Zyyy So S Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Other_Symbol Print X_POSIX_Print Symbol Specials Unicode
如果我理解 Unicode U+FFFD 字元的描述,它根本不是真正的字元,而是損壞字元的佔位符。這是有道理的,因為該文件實際上不是 UTF-8 編碼的。
您的文件包含兩個字節,EB 和 0A(十六進制)。該文件很可能使用每個字元一個字節的字元集,例如ISO-8859-1;在那個字元集中,EB 是 ë:
$ printf "\353\n" | iconv -f ISO-8859-1 ë
其他候選人將是程式碼頁 437中的 δ ,程式碼頁 850中的 Ù …
od -x
在這種情況下,由於字節序, 的輸出令人困惑;更好的選擇是-t x1
使用單字節:$ printf "\353\n" | od -t x1 0000000 eb 0a 0000002
od -x
maps tood -t x2
which 一次讀取兩個字節,並且在 little-endian 系統上以相反的順序輸出字節。當您遇到這樣的文件時,它不是有效的 UTF-8(或在解釋為 UTF-8 文件時毫無意義),沒有萬無一失的方法來自動確定其編碼(和字元集)。上下文可以提供幫助:如果它是過去幾十年在西方 PC 上生成的文件,它很有可能以 ISO-8859-1、-15(歐元變體)或 Windows-1252 編碼;如果它比這更老,CP-437 和 CP-850 可能是候選者。來自東歐系統、俄羅斯系統或亞洲系統的文件將使用我不太了解的不同字元集。然後是 EBCDIC…
iconv -l
將列出所有iconv
知道的字元集,您可以從那里通過反複試驗繼續進行。(有一次我對 CP-437 和 ATASCII 的大部分內容都熟記於心,那是那個時代。)