在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 ...