iconv和希腊文件名

时间:2012-07-11 10:03:06

标签: php unicode iconv

我在使用希腊文件名(例如'φωτογραφία.jpg')在浏览器中显示图像时出现问题。使用这个脚本,我发现我需要使用iconv()进行哪两种编码,这样我才能在浏览器中正确显示文件名。图像本身虽然无法渲染。

<? 
$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;
?>

工作链接here,从UTF-8转换时返回正确的文件名 - &gt; Windows的1253。

Apache / 2.2.22(Unix)上的环境是PHP 5.2.17,文件已从Windows机器上传。目前,我只通过将它们硬编码到测试PHP文件中来测试2-3个图像。如果从数据库查询中提取文件名,您认为会有所不同吗?

2 个答案:

答案 0 :(得分:1)

网址不太可能与其中的文字多字节字符一起使用。您需要通过urlencode()传递它们才能获得合理的结果。

E.g。

$file = 'φωτογραφία.jpg';
echo '<p><a href="'.urlencode($file).'" target="_self"><img src="'.urlencode($file).'" width="100" height="100" border="1"></a></p>';

这会产生类似于:

的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>

答案 1 :(得分:0)

  

Apache / 2.2.22(Unix)上的环境是PHP 5.2.17,文件已从Windows机器上传。

啊,但你上传了什么编码?因为WinNT文件名是native-unicode,而Unix文件名是native-bytes,所以文件上传过程必须选择一个编码来在它们之间进行转换。

当在shell或本地桌面中显示时,大多数Linux框将其文件名解释为UTF-8,因此这是一个合理的选择,并且IRI也总是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编码。