Php 如何找出用户上传文档的字符集?
我编写了一个脚本,允许用户使用CSV文件一次上载/导入大量用户。我正在使用MySQL的load data local Infle来实现这一点:Php 如何找出用户上传文档的字符集?,php,mysql,utf-8,character-encoding,user-input,Php,Mysql,Utf 8,Character Encoding,User Input,我编写了一个脚本,允许用户使用CSV文件一次上载/导入大量用户。我正在使用MySQL的load data local Infle来实现这一点: $query = "LOAD DATA LOCAL INFILE $file INTO TABLE my_table FIELDS TERMINATED BY $delimiter LINES TERMINATED BY '\\n' (email, name, organization); 但是一个用户试图导入一个包含名称Günther的文档。这
$query = "LOAD DATA LOCAL INFILE $file INTO TABLE my_table
FIELDS TERMINATED BY $delimiter
LINES TERMINATED BY '\\n'
(email, name, organization);
但是一个用户试图导入一个包含名称Günther
的文档。这被保存到数据库中作为“G”(其余部分的切割)。该文档原来是拉丁语的1
导致了这些问题。我不想用字符集之类的东西来打扰我的用户
我知道加载数据本地填充支持的字符集
选项。但是,即使我在查询中放入字符集latin1
时没有出现错误,我还是希望所有内容都是UTF-8。如果我发现其他用户使用的文件不是UTF-8或latin1格式,会发生什么
那么,我如何找出用户上传文档的字符集以及如何将其转换为UTF-8?在运行$query之前,您可以使用mb\u detect\u编码找到字符编码。这将帮助您在加载文件之前检测最可能的编码 假设文件名位于$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的
这只是一种变通方法和启发式方法。一定要处理好
所有可能发生的例外情况(我认为这可能很乏味)
(猜测)
有一个编写的类可能满足您的需求(尚未测试代码)这在理论上是不可能的;)幸运的是,有一些启发式方法可以帮助您以很高的概率猜测正确的编码。请参见示例:您至少应该提到,这只是一种启发式方法,即可能会出现严重错误。是的@Deduplicator,您是对的。应该马上进行编辑。谢谢@谢谢你的回答。非常感谢。但我不禁想,我不可能是第一个偶然发现这一点的人。正如您和“重复数据消除器”所指出的,它的内容远不止此脚本。“难道没有一个开源类工作得很好吗?”Davidjansen用一个链接修改了答案。这可能对你有帮助。