上传文件中的重音被“?”替换

时间:2011-06-22 23:31:41

标签: php codeigniter file-upload character-encoding diacritics

我正在为我正在处理的网站的管理部分构建数据导入工具。数据包括法语和英语,并包含许多重音字符。每当我尝试上传文件,解析数据并将其存储在我的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_encodeutf8_decode中包装我的字符串。两者都没有。

如果有人对我可以尝试的事情有任何建议,我将非常感激。

3 个答案:

答案 0 :(得分:4)

重要的是查看在向mySQL发出查询之前或之后是否发生了损坏。这里发生了太多可能的事情,无法确定它。你能输出你的MySql来检查吗?

假设您的查询已正确形成(在输出查询的阶段没有损坏),您应该检查几件事。

  1. 数据库本身的字符编码是什么? (核对)

  2. 什么是连接的字符集 - 这可能无法在您的mysql配置中正确设置,可以使用'SET NAMES'命令手动设置

  3. 在我自己的应用程序中,我在建立连接后发出'SET NAMES utf8'作为我的第一个查询,因为我无法更改MySQL配置。

    看到这个。 http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

    编辑:如果问题与mysql无关,请查看以下内容

    1. 你说文件的编码是'charset is iso-8859-1' - 请问你对此有何看法?

    2. 如果您将文件本身保存为utf8(没有BOM)并尝试重新处理它会发生什么?

    3. 正在执行转换的 php 文件的编码是什么? (你用什么来编写你的php - 可能是以不受欢迎的方式“管理”这个)

    4. (旁白)您正在处理的文件是否适合使用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,那将会好得多,因为它几乎可以处理人类已知的所有角色。