![如何在 UTF-8 控制台中查看 cp1251 文字檔?](https://rvso.com/image/36032/%E5%A6%82%E4%BD%95%E5%9C%A8%20UTF-8%20%E6%8E%A7%E5%88%B6%E5%8F%B0%E4%B8%AD%E6%9F%A5%E7%9C%8B%20cp1251%20%E6%96%87%E5%AD%97%E6%AA%94%EF%BC%9F.png)
嘗試1:
$ less subs.srt
"subs.srt" may be a binary file. See it anyway?
<C8><F2><E0><EB><FC><FF><ED> ...
嘗試2:
$ LANG=ru_RU.CP1251 less subs.srt
����� �����, ��� ������.
��� ������� �������������! ...
解決方法:
$ iconv -f cp1251 < subs.srt | less
我怎樣做才方便呢?
答案1
若要以less
與終端不同的編碼運行,請使用盧伊特(隨 X11 實用程式套件一起提供)。
LANG=ru_RU.CP1251 luit less subs.srt
如果您想自動偵測編碼,那就更棘手了,因為文字檔案不包含其編碼的指示。軟體恩卡嘗試根據文件的語言識別文件的編碼:
$ enca -L russian subs.srt
MS-Windows code page 1251
$ iconv -f "$(enca -iL russian subs.srt)" | less
您可以將此組合作為LESSOPEN
過濾器(請參閱如何在 less 中查看 gzip 壓縮檔而無需輸入 zless?舉個例子)。然而,對於實際上不是俄語的文本,這可能不會給出好的結果。
如果您僅使用 UTF-8 和 CP1251,則在檔案傳輸時可以回退到 CP1251不是有效的 UTF-8— UTF-8 中存在“漏洞”,導致大多數 8 位元編碼的檔案不是有效的 UTF-8。概念驗證過濾器腳本LESSOPEN
(可能不適用於 Linux 以外的系統,因為它依賴head -c N
精確讀取 N 個位元組):
#!/bin/sh
head=$(head -c 1000)
if printf '%s\n' "$head" | grep -qav '^.*$'; then
{ printf '%s\n' "$head"; cat; } | iconv -f CP1251
else
{ printf '%s\n' "$head"; cat; }
fi