如何将使用CRLF行终止符的非ISO扩展ASCII文本的编码更改为UTF-8?


21

我有一个txt文件:

$ file -i x.txt
x.txt: text/plain; charset=unknown-8bit
$ file x.txt 
x.txt: Non-ISO extended-ASCII text, with CRLF line terminators

并且有些字符编码不正确:

trwa³y, sta³y, usuwaæ

如何将该文件的编码更改为UTF-8?到目前为止,我已经尝试了以下方法:

$ iconv -f ASCII -t UTF-8 x.txt
                puiconv: illegal input sequence at position 4

也许我应该以某种方式使用extended ASCIIhigh ASCII),但无法在iconv的编码列表中找到它。


2
您可以将文件上传到某个地方吗?
janos 2014年

有8位ISO编码,均显示并排侧,一个方便的名单在这里。它们中的任何一个看起来都与您在文件中观察到的相近吗?例如,如果您认为“sta³y”应为“ stacy”,那么对于该单词中奇怪的十六进制代码,找到哪种编码都带有“ c”。
2014年

大约90%的时间中,“非ISO扩展ASCII文本”将是使用Windows 1252代码页编码的文件。“它可能是世界上最常用的8位字符编码。” (维基百科)。首先尝试:iconv -f windows-1252 -t utf-8 file
nyov

Answers:


33

file 告诉您“非ISO扩展ASCII文本”,因为它检测到以下内容:

  • 除换行符外,最有可能是缺少控制字符(字节值0-31)的“文本”文件;
  • “ extended-ASCII”,因为存在超出ASCII范围的字符(字节值≥128);
  • “ non-ISO”,因为其中的字符在128–159范围内(ISO 8859为控制字符保留了该范围)。

您必须弄清楚该文件似乎采用哪种编码。您可以尝试Enca的自动识别。您可能需要通过以文本是哪种语言来告诉它,以正确的方向微调它。

enca x.txt
enca -L polish x.txt

要转换文件,请传递-x选项:enca -L polish x.txt -x utf8 >x.utf8.txt

如果您不能或不想使用Enca,则可以手动猜测编码。环顾四周告诉我这是波兰语文字,单词是trwały,stały,usuważ,所以我们正在寻找³łæ→ 的翻译ż。这看起来像是latin-2latin-10或更多(给定为latin1的 “ non-ISO” CP1250)。要将文件转换为UTF-8,可以使用recodeiconv

recode CP1250..utf8 <x.txt >x.utf8.txt
iconv -f CP1250 -t UTF-8 <x.txt >x.utf8.txt

我不参与< x.txt > x.utf8.txt为什么我们要使用<然后>?它是如何工作的?
Filip Bartuzi 2015年


1

使用gedit打开文本文件,然后在“另存为..”对话框中看到当前的编码。


0

您是否尝试找出x.txt的确切编码?您将获得支持的编码列表

iconv-列表

有时候,我碰巧会发现latin1和utf8之间不匹配。然后,它通常有助于将其转换为utf8,反之亦然。


0

我已经使用enca库创建了一个自动转换脚本,我在NAS上使用了该脚本将字幕转换为UTF-8,但是它可以用于任何自动转换

随时使用:)

编辑:

#!/bin/bash
LANGUAGE=czech
TO=utf8
CONVERT="enca -L $LANGUAGE -x $TO"

# Find and onvert
find ./ -type f -name "*.srt" | while read fn; do
  IS_TARGET=`enca "${fn}" | egrep -ow -m 1 'UTF-8|Unrecognized|KOI8-CS2|7bit ASCII|UCS-2|Macintosh Central European'`

    if [ "$IS_TARGET" != "UTF-8" ] &&
       [ "$IS_TARGET" != "UCS-2" ] &&
       [ "$IS_TARGET" != "Macintosh Central European" ] &&
       [ "$IS_TARGET" != "Unrecognized" ] &&
       [ "$IS_TARGET" != "7bit ASCII" ] &&
       [ "$IS_TARGET" != "KOI8-CS2" ]; then

        echo "${fn} ---- Will be converted!"
    # optional backup of original srt
        # cp "${fn}" "${fn}.bak"
        $CONVERT "${fn}"
    fi  

done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.