Encoding Windows-1252到UTF-8编码

Encoding Windows-1252到UTF-8编码,encoding,utf-8,character-encoding,windows-1252,Encoding,Utf 8,Character Encoding,Windows 1252,我已将某些文件从Windows计算机复制到Linux计算机。因此,所有Windows编码(Windows-1252)文件都需要转换为UTF-8。不应更改已在UTF-8中的文件。我计划使用recode实用程序来实现这一点。如何指定recode实用程序只转换windows-1252编码的文件而不转换UTF-8文件 重新编码的示例用法: recode windows-1252.. myfile.txt 这将把myfile.txt从windows-1252转换为UTF-8。在此之前,我想知道myfil

我已将某些文件从Windows计算机复制到Linux计算机。因此,所有Windows编码(Windows-1252)文件都需要转换为UTF-8。不应更改已在UTF-8中的文件。我计划使用
recode
实用程序来实现这一点。如何指定
recode
实用程序只转换windows-1252编码的文件而不转换UTF-8文件

重新编码的示例用法:

recode windows-1252.. myfile.txt

这将把
myfile.txt
从windows-1252转换为UTF-8。在此之前,我想知道
myfile.txt
实际上是windows-1252编码的,而不是UTF-8编码的。否则,我相信这会损坏该文件。

您希望重新编码如何知道文件是Windows-1252?理论上,我相信任何文件都是有效的Windows-1252文件,因为它将每个可能的字节映射到一个字符

现在肯定有一些特性强烈地表明它是UTF-8——例如,如果它以UTF-8 BOM开头的话——但它们并不是决定性的

一个选择是首先检测它是否是一个完全有效的UTF-8文件,我想。。。同样,这只是一种暗示

我不熟悉recode工具本身,但您可能想看看它是否能够将文件从相同的编码重新编码到相同的编码中-如果您使用无效文件(即包含无效UTF-8字节序列的文件)执行此操作,它可能会将无效序列转换为问号或类似的内容。此时,您可以通过将文件重新编码为UTF-8并查看输入和输出是否相同来检测该文件是否为有效的UTF-8

或者,以编程方式执行此操作,而不是使用recode实用程序——例如,在C#中,这将非常简单

只是重申一下:所有这些都是启发性的。如果你真的不知道一个文件的编码,没有什么能100%准确地告诉你。

使用iconv命令


要确保该文件位于Windows-1252中,请在记事本(Windows下)中打开它,然后单击“另存为”。记事本建议将当前编码作为默认编码;如果是Windows-1252(或任何一个1字节的代码页),它会说“ANSI”。

iconv-f Windows-1252-t UTF-8 filename.txt
没有通用的方法来判断文件是否使用特定的编码。请记住,编码只不过是文件中的位如何映射到字符的“约定”

如果您不知道哪些文件实际上已经在UTF-8中编码,哪些文件在windows-1252中编码,那么您必须检查所有文件并找到您自己。在最坏的情况下,这可能意味着您必须使用这两种编码中的任何一种打开它们中的每一个,并查看它们是否“看起来”正确——即,所有字符都正确显示。当然,您可以使用工具支持来实现这一点,例如,如果您确实知道windows-1252与UTF-8中具有不同映射的文件中包含某些字符,您可以在通过Seva Akekseyev提到的“iconv”运行文件后对其进行grep


另一个幸运的例子是,如果您知道文件实际上只包含UTF-8和windows-1252中编码相同的字符。当然,在这种情况下,您已经完成了。

如果您确定您的文件是UTF-8或Windows 1252(或Latin1),您可以利用这样一个事实,即如果您尝试转换无效文件,重新编码将以错误退出

虽然utf8在Win-1252中有效,但反过来则不正确:Win-1252在UTF-8中无效。因此:

recode utf8..utf16 <unknown.txt >/dev/null || recode cp1252..utf8 <unknown.txt >utf8-2.txt
recode utf8..utf16/dev/null | | recode cp1252..utf8 utf8-2.txt
将吐出所有cp1252文件的错误,然后继续将其转换为UTF8

我将把它包装成一个更干净的bash脚本,保存每个转换文件的备份


在进行字符集转换之前,您可能希望首先确保所有文件中的行尾一致。否则,recode会因此而抱怨,并且可能会转换已经是UTF8的文件,但只是有错误的行尾。

下面是我对类似问题给出的另一个答案的抄本:

如果将utf8_encode()应用于已存在的utf8字符串,它将返回一个乱码utf8输出

我做了一个函数来解决所有这些问题。它被称为Encoding::toUTF8()

您不需要知道字符串的编码是什么。它可以是拉丁文1(iso 8859-1)、Windows-1252或UTF8,或者字符串可以混合使用它们。Encoding::toUTF8()将所有内容转换为UTF8

我这样做是因为一个服务给了我一个混乱的数据源,在同一个字符串中混合了UTF8和Latin1

用法:

$utf8_string = Encoding::toUTF8($utf8_or_latin1_or_mixed_string);

$latin1_string = Encoding::toLatin1($utf8_or_latin1_or_mixed_string);
$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
下载:

更新:

我包含了另一个函数Encoding::fixUFT8(),它将修复每个看起来乱码的UTF8字符串

用法:

$utf8_string = Encoding::toUTF8($utf8_or_latin1_or_mixed_string);

$latin1_string = Encoding::toLatin1($utf8_or_latin1_or_mixed_string);
$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
示例:

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
将输出:

Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football

更新:我已经将函数(forceUTF8)转换为一个名为Encoding的类上的静态函数族。新函数是Encoding::toUTF8()。

您可以使用记事本++等编辑器更改文件的编码。只需转到“编码”并选择所需内容

我总是喜欢Windows 1252,我发现:

将ASCII(Windows1252)文件转换为Unicode(UCS-2 le)文本文件:

For /f "tokens=2 delims=:" %%G in ('CHCP') do Set _codepage=%%G    
CHCP 1252 >NUL    
CMD.EXE /D /A /C (SET/P=ÿþ)<NUL > unicode.txt 2>NUL    
CMD.EXE /D /U /C TYPE ascii_file.txt >> unicode.txt    
CHCP %_codepage%    
For/f“tokens=2 delims=:”%%G in('CHCP')do Set _codepage=%%G
CHCP 1252>NUL
CMD.EXE/D/A/C(SET/P=ÿþ)unicode.txt 2>NUL
CMD.EXE/D/U/C类型ascii_file.txt>>unicode.txt
CHCP%\u代码页%
上述技术(基于Carlos M.的脚本)首先创建一个带有字节顺序标记(BOM)的文件,然后附加原始文件的内容。CHCP用于确保会话使用Windows1252代码页运行,以便正确解释字符0xFF和0xFE(ÿþ)。

如果需要