Character-Encoding

ASCII 到 ANSI 的轉換不起作用

  • November 3, 2021

嘗試在 Linux 上將 ASCII 文件轉換為 ANSI:

$ file -bi relocate.xml 
text/xml; charset=us-ascii
$ iconv -f us-ascii -t ms-ansi < relocate.xml | file -bi -
text/xml; charset=us-ascii
$ cat relocate.xml | recode us-ascii..ms-ansi | file -bi -
Request: ANSI_X3.4-1968..:libiconv:..CP1252
Shrunk to: ANSI_X3.4-1968..CP1252
text/xml; charset=us-ascii

我還嘗試了其他工具來推斷編碼,它們都返回相同的結果:

$ enca -L none relocate.xml ; echo "###" ; uchardet relocate.xml ; echo "###" ; encguess relocate.xml 
7bit ASCII characters
 CRLF line terminators
###
ASCII
###
relocate.xml    US-ASCII

如您所見,工具iconvrecode工具都沒有錯誤消息,但最終編碼仍然是us-ascii.

如何將其轉換為 ANSI?

如果您要轉換為 (ms-ansi = windows-1252) 的編碼是您要從 (ascii) 轉換的編碼的超集,iconv則將保持原樣,因為顯然沒有什麼可做的。

此外,文件的“字元集”不是某種強制性元數據,file實用程序只是在猜測,使用不可靠的啟發式算法,失敗率約為 20%,這可能是什麼。

例子:

$ printf '%s\n' '<?xml version="1.0" encoding="UTF-8"?>' '<a>' '<b>'{0..100000}'</b>' '<c>😊</c>' '</a>' > /tmp/foo.xml 
$ file /tmp/foo.xml 
/tmp/foo.xml: XML 1.0 document, ASCII text
$ file -bi /tmp/foo.xml 
text/xml; charset=us-ascii

不,該文件是一個 UTF-8 文件,它也有正確的 xml 聲明。


從評論:

Windows 10 Sysprep 拒絕了我的relocate.xml文件,所以我認為編碼錯誤。

添加正確的 xml 聲明(<?xml ... ?>如上)並使用一些 xml 驗證器檢查 xml 語法是否正常。

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