Character-Encoding

如何辨識奇怪的字元?

  • March 9, 2018

我正在嘗試辨識在我正在使用的文件中發現的一個奇怪字元:

$ 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作為“十六進制程式碼點”又似乎是錯誤的.

那麼,我如何使用三個選項( 或 )中的任何一個355005353找出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 -xmaps to od -t x2which 一次讀取兩個字節,並且在 little-endian 系統上以相反的順序輸出字節。

當您遇到這樣的文件時,它不是有效的 UTF-8(或在解釋為 UTF-8 文件時毫無意義),沒有萬無一失的方法來自動確定其編碼(和字元集)。上下文可以提供幫助:如果它是過去幾十年在西方 PC 上生成的文件,它很有可能以 ISO-8859-1、-15(歐元變體)或 Windows-1252 編碼;如果它比這更老,CP-437 和 CP-850 可能是候選者。來自東歐系統、俄羅斯系統或亞洲系統的文件將使用我不太了解的不同字元集。然後是 EBCDIC…iconv -l將列出所有iconv知道的字元集,您可以從那里通過反複試驗繼續進行。

(有一次我對 CP-437 和 ATASCII 的大部分內容都熟記於心,那是那個時代。)

引用自:https://unix.stackexchange.com/questions/361923