在Linux服务器上,如果用户上传在MS Office Excel中创建的CSV文件(因此具有 Windows 1250 [或cp1250或ASCII,如果你想]编码)所有我知道的检测文件编码的方法返回错误 ISO-8859-1 (如果你想要latin1 )编码 .

这对于编码转换为最终 UTF-8 至关重要 .

方法我试过:

  • cli

  • file -i [FILE] 返回iso-8859-1

  • file -b [FILE] 返回iso-8859-1

  • vim

  • vim [FILE] 然后 :set fileencoding? 返回latin1

  • PHP

  • mb_detect_encoding(file_get_contents($filename)) 返回(令人惊讶的)UTF-8

while the file is indeed in WINDOWS-1250 (ASCII) as证明即在LibreOffice中打开CSV文件 - Math要求文件编码并选择ISO-8859-1或UTF-8中的任何一个会导致错误显示的字符,而选择ASCII会正确显示所有字符!

如何在Linux服务器(Ubuntu)上正确检测文件编码(如果可能的话,使用默认的Ubuntu实用程序或使用PHP)?

我能想到的最后一个选项是在上传文件时检测用户代理(和用户操作系统),然后是Windows然后自动假设编码是ASCII ...