如何找出用户上传文件的字符集?

时间:2014-06-27 11:38:26

标签: php mysql utf-8 character-encoding user-input

我编写了一个脚本,允许用户使用CSV文件一次上传/导入大量用户。我正在使用MySQL的加载数据本地infile来实现这个目的:

$query = "LOAD DATA LOCAL INFILE $file INTO TABLE my_table 
FIELDS TERMINATED BY $delimiter 
LINES TERMINATED BY '\\n' 
(email, name, organization);

但是,用户尝试导入包含名称Günther的文档。这被保存到数据库中作为“G”(其余的切割)。该文件原来是latin1导致问题。我不想用字符集和东西来打扰我的用户。

我知道load data local infile支持的character set选项。但是,即使我在查询中放入CHARACTER SET latin1时没有出错,我希望所有内容都是UTF-8。如果我的其他用户使用的文件既不是UTF-8也不是latin1会怎样?

那么如何找出用户上传文档的字符集是什么以及如何将其转换为UTF-8?

1 个答案:

答案 0 :(得分:1)

在运行$ query之前,您可以使用mb_detect_encoding找到字符编码。这将有助于您在加载文件之前检测最可能的编码。

假设文件名在 $ str

这是一个可能有用的基本示例。

<?php
/* Detect character encoding with current detect_order */
echo mb_detect_encoding($str);

/* "auto" is expanded according to mbstring.language */
echo mb_detect_encoding($str, "auto");

/* Specify encoding_list character encoding by comma separated list */
echo mb_detect_encoding($str, "JIS, eucjp-win, sjis-win");

/* Use array to specify encoding_list  */
$ary[] = "ASCII";
$ary[] = "JIS";
$ary[] = "EUC-JP";
echo mb_detect_encoding($str, $ary);
?>

这是指向php.net&#39; s mb_detect_encoding

的链接
  

这只是一种解决方法和启发式方法。确保你处理   所有可能产生的例外情况(可能很乏味,我   猜

phpclasses.org

上编写了一个可能符合您要求( Haven未对代码进行测试)的课程