使用 PHP 保存文件时设置字符集


set charset when saving files with php

我用PHP创建了一个简单的代码,用于将图片上传到文件夹。

在服务器端,我有

    <?php
 header('Content-Type: text/plain; charset=utf-8');
//check if file is actually an image etc.
//if is an image, send it to "upload" folder
     move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . $_FILES["file"]["name"]);
//save to the database a string like "upload/myImage.jpg", so I can render it on the site later
$stu = $dbh->prepare("UPDATE multi SET m_place=:name WHERE m_id = :id");
$stu->bindParam(':name', $n, PDO::PARAM_STR);
$n= "upload/".$_FILES["file"]["name"];                                          
$stu->execute();

问题出在哪里?

如果文件夹中的图像名称是英文的,我会看到"myImage01.jpg",在数据库中也看到"upload/myImage01.jpg"。但是,如果图像的名称在文件夹中是希腊语,我会看到"χωΟΞ―Ο' Ο"Ξ―Ο"λο.jpg"和数据库"upload/χωΟΞ―Ο' Ο"Ξ―Ο"λο.jpg"。这是错误的。Insted of χωΟΞ―Ο' Ο"Ξ―Ο"λο 我应该得到"χωρις τιτλο"(顺便说一句,这是希腊语"no title"的意思)。所以,我猜字符集问题?

我该如何解决这个问题?

提前致谢

听起来您的数据库没有正确的排序规则。确保表/列使用 utf8_general_ci 进行排序规则。

在处理 UTF8 时,同样极其重要的是使用以下两行 MySQL 行来处理GET请求......

SET time_zone = '+00:00'
SET CHARACTER SET 'utf8'

。当您有POST请求时,请使用以下两个...

SET time_zone = '+00:00'
SET NAMES 'utf8'

这些将有助于确保正确维护 UTF8 字符。

最后,我发现"PHP 文件系统函数只能处理系统代码页中的字符"。多亏了这一点,我解决了我的问题。

我使用了iconv函数

所以我像这样改变了move_uploaded_file

move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . iconv('UTF-8', 'Windows1253',$_FILES["file"]["name"]));