查找自动编码检测的原因(UTF-8与Windows-1252)

查找自动编码检测的原因(UTF-8与Windows-1252),utf-8,character-encoding,preg-replace,magento2,windows-1252,Utf 8,Character Encoding,Preg Replace,Magento2,Windows 1252,我有一个内容为UTF-8编码的CSV。但是,各种应用程序和系统错误地将CSV编码检测为Windows-1252,这会打断文件中的所有特殊字符(例如Umlauts) 例如,我可以看到升华文本(在Windows上)在第一次打开文件时也会自动检测到错误的Windows-1252编码,在需要特殊字符的地方显示乱码文本 当我选择使用编码重新打开»UTF-8时,一切都会像预期的那样正常 现在,为了找到错误的来源,我认为这可能有助于弄清楚,为什么这些应用程序首先不能自动检测正确的编码。例如,可能在某个地方有一

我有一个内容为UTF-8编码的CSV。但是,各种应用程序和系统错误地将CSV编码检测为
Windows-1252
,这会打断文件中的所有特殊字符(例如Umlauts)

例如,我可以看到升华文本(在Windows上)在第一次打开文件时也会自动检测到错误的
Windows-1252
编码,在需要特殊字符的地方显示乱码文本

当我选择使用编码重新打开»UTF-8时,一切都会像预期的那样正常

现在,为了找到错误的来源,我认为这可能有助于弄清楚,为什么这些应用程序首先不能自动检测正确的编码。例如,可能在某个地方有一个编码错误的散乱字符

讨论中的CSV实际上是Magento 2安装自动生成的产品导出。最近字符编码中断,我目前正在试图弄清楚发生了什么-因此,我调查了为什么此导出被检测为
Windows-1252


有没有可靠的方法可以找出为什么像Sublime Text这样的应用程序的自动检测采用了错误的字符编码?

这就是我最后所做的,以找出文件未被检测为UTF-8的原因,即查找未被编码为UTF-8的字符。由于PHP对我来说更容易使用,我决定简单地使用下面的脚本,使用非常方便的库强制将任何不是UTF-8的内容转换为UTF-8

$before=文件获取内容('export.csv');
$after=\ForceUTF8\Encoding::toUTF8($before);
文件内容('export.fixed.csv',$after);
然后,我使用了一个文件比较工具(如Beyond Compare)来比较两个生成的CSV,以便更容易地看到哪些字符最初不是用UTF-8编码的

这反过来又向我表明,只有一列出口受到影响。经过进一步调查,我发现该列的内容是用PHP处理的,带有以下
preg\u replace

$value=preg_replace('/([^\pL0-9-])+/,''$value);

在正则表达式中使用
\p
有一个未知的副作用:所有特殊字符都转换为另一种编码。解决这个问题的一个快速方法是在正则表达式上使用
u
标志(请参阅)。这迫使该
preg\u replace
的结果编码为UTF-8。另请参见。

这是否发生在Windows上?导出是在Linux系统下生成的,我在Windows下用升华文本打开了该文件。升华文本也不会在MacOS上使用UTF-8打开文件。根据Sublime Text将尝试确定文件是否有效UTF-8,如果无效,
Windows-1252
cp-1252
?)将作为后备方案。我想知道为什么这个特定的文件不能被检测为有效的UTF-8。虽然UTF-8通常不需要BOM表,但是添加一个可以帮助这些倒霉的Windows实用程序正确地检测编码。我不知道如何使用Magento导出来实现这一点,但是如果您可以在这两者之间添加一个手动步骤,只需在复制文件之前预编三个字节。您能检查一下文件中的某个地方是否没有混合这两种编码吗?请尝试使用其他编辑器。不可靠源于检测。把你知道的告诉这个节目。