Php iconv和希腊文文件名

Php iconv和希腊文文件名,php,unicode,iconv,Php,Unicode,Iconv,我在浏览器中显示希腊文件名的图像时遇到问题(例如'φωτογραφαα.jpg')。通过使用此脚本,我找到了需要在iconv()中使用的2种编码,以便在浏览器中正确显示文件名。但图像本身无法渲染 <? $file = 'φωτογραφία.jpg'; $encodings = array("UTF-8", "ASCII", "Windows-1253", "ISO-8859-1", "UTF-16"); $iconv = ""; foreach ($encodings as $i) {

我在浏览器中显示希腊文件名的图像时遇到问题(例如'φωτογραφαα.jpg')。通过使用此脚本,我找到了需要在iconv()中使用的2种编码,以便在浏览器中正确显示文件名。但图像本身无法渲染

<? 
$file = 'φωτογραφία.jpg';
$encodings = array("UTF-8", "ASCII", "Windows-1253", "ISO-8859-1", "UTF-16");
$iconv = "";
foreach ($encodings as $i) {
  foreach ($encodings as $j) {
    if($j!==$i) $iconv .= "<br /> $i -> $j: ".iconv($i, $j, $file);
  }
}
echo $iconv;
?>

工作链接,从UTF-8->Windows-1253转换时重新运行正确的文件名


环境是Apache/2.2.22(Unix)上的PHP5.2.17,文件是从Windows计算机上载的。目前,我只测试了2-3个图像,将它们硬编码到一个测试PHP文件中。您认为从数据库查询中提取文件名会有所不同吗?

URL不太可能使用文本多字节字符。您需要通过
urlencode()
传递它们,以获得合理的结果

例如

$file='φωτογραφία.jpg';
回声“

”;
这将生成类似以下内容的HTML:

<p><a href="%CF%86%CF%89%CF%84%CE%BF%CE%B3%CF%81%CE%B1%CF%86%CE%AF%CE%B1.jpg" target="_self"><img src="%CF%86%CF%89%CF%84%CE%BF%CE%B3%CF%81%CE%B1%CF%86%CE%AF%CE%B1.jpg" width="100" height="100" border="1"></a></p>

环境是Apache/2.2.22(Unix)上的PHP5.2.17,文件是从windows计算机上载的

啊,但是你是用什么编码上传的?因为WinNT文件名是本机unicode,而Unix文件名是本机字节,所以文件上载过程必须选择一种编码在它们之间进行转换

大多数Linux框在shell或本地桌面中显示时将其文件名解释为UTF-8,因此这是一个合理的选择,而且IRIs始终是UTF-8,因此如果您希望文件名在浏览器地址栏中显示为φωτογραφία.jpg,这就是您想要使用的编码。在这种情况下,URI编码的版本将是
%cf%86%cf%89%cf%84%ce%bf%ce%b3%cf%81%ce%b1%cf%86%ce%af%ce%b1.jpg

但是,某些Windows工具将默认为“ANSI代码页”,这是一种特定于语言环境的编码。所以如果你在希腊版本的Windows上使用这样的工具,你会得到cp1253;如果你在西欧安装中使用它,你会得到cp1252,它会中断,因为希腊字母在该编码中不可用。如果您的上传工具不允许您指定编码,请使用更好的上传工具。(例如WinSCP)


正如Dave提到的(+1),无论使用哪种编码,您都需要对非ASCII字节进行URI编码。

您实际上在对文件名做什么?它们是产品图像,需要在eshop中显示。您在代码方面做什么…:)我只是想找到适当的转换,让它们显示在浏览器中。如果我这样做了,那么我将把文件名传递到一个数据库,以便从那里提取它们。(我误解了你问题的重点吗?我觉得我是!)我理解你的意思,但它不起作用,你是什么意思?你在哪里看到的�s上面的代码应该生成所有ASCII字符,并且应该让服务器将其转换为正确的二进制序列…@bikey77您可以显示该PHP脚本的完整源代码,包括您回显
标记的行吗?很抱歉,混淆了,我编辑了我的第一条评论。我用了你的代码,什么也没改。这似乎很奇怪,当我查看文件的源代码时,我看到的是文字多字节字符,而不是
%xx
序列。。。由于Windows(文件的源代码),我希望您只需将文档声明为UTF-8即可。试试看会发生什么。
<p><a href="%CF%86%CF%89%CF%84%CE%BF%CE%B3%CF%81%CE%B1%CF%86%CE%AF%CE%B1.jpg" target="_self"><img src="%CF%86%CF%89%CF%84%CE%BF%CE%B3%CF%81%CE%B1%CF%86%CE%AF%CE%B1.jpg" width="100" height="100" border="1"></a></p>