我正在为我正在处理的网站的管理部分构建数据导入工具。数据包括法语和英语,并包含许多重音字符。每当我尝试上传文件,解析数据并将其存储在我的MySQL数据库中时,重音都将替换为“?”。
我有包含数据的文本文件(charset是iso-8859-1),我使用CodeIgniter的文件上传库将其上传到我的服务器。然后我用PHP读取文件。
我的代码与此类似:
$this->upload->do_upload()
$data = array('upload_data' => $this->upload->data());
$fileHandle = fopen($data['upload_data']['full_path'], "r");
while (($line = fgets($fileHandle)) !== false) {
echo $line;
}
这会生成带有'?'的重音符号的行。其他一切都是正确的。
如果我通过FTP从我的服务器下载上传的文件,那么charset仍然是iso-8850-1,但差异显示该文件已更改。但是,如果我在TextEdit中打开文件,它会正确显示。
我尝试使用PHP的stream_encoding
方法将我的文件流显式设置为iso-8859-1,但我的PHP版本没有这个方法。
在用完了想法之后,我尝试在utf8_encode
和utf8_decode
中包装我的字符串。两者都没有。
如果有人对我可以尝试的事情有任何建议,我将非常感激。
答案 0 :(得分:4)
重要的是查看在向mySQL发出查询之前或之后是否发生了损坏。这里发生了太多可能的事情,无法确定它。你能输出你的MySql来检查吗?
假设您的查询已正确形成(在输出查询的阶段没有损坏),您应该检查几件事。
数据库本身的字符编码是什么? (核对)
什么是连接的字符集 - 这可能无法在您的mysql配置中正确设置,可以使用'SET NAMES'命令手动设置
在我自己的应用程序中,我在建立连接后发出'SET NAMES utf8'作为我的第一个查询,因为我无法更改MySQL配置。
看到这个。 http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html
编辑:如果问题与mysql无关,请查看以下内容
你说文件的编码是'charset is iso-8859-1' - 请问你对此有何看法?
如果您将文件本身保存为utf8(没有BOM)并尝试重新处理它会发生什么?
正在执行转换的 php 文件的编码是什么? (你用什么来编写你的php - 可能是以不受欢迎的方式“管理”这个)
(旁白)您正在处理的文件是否适合使用fgetcsv进行处理? http://php.net/manual/en/function.fgetcsv.php
答案 1 :(得分:1)
上传到您服务器的文件应在下载时返回相同的内容。这意味着,不应更改文件的编码(只是一堆二进制数据)。相反,您应该注意,您可以保存该文件的二进制信息。
要使用您的数据库实现此目的,请创建一个BLOB字段。这是适合它的列类型。这只是二进制数据。
假设您正在使用MySQL,这是参考:The BLOB and TEXT Types,请注意BLOB。
答案 2 :(得分:0)
问题是您使用的是iso-8859-1而不是utf-8。为了在正确的字符集中对其进行编码,您应该使用iconv函数,如下所示:
$output_string = iconv('utf-8", "utf-8//TRANSLIT", $input_string);
iso-8859-1没有任何类型重音的编码。
如果一切都是utf-8,那将会好得多,因为它几乎可以处理人类已知的所有角色。