0

我在浏览器中显示带有希腊文件名(例如“φωτογραφία.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) 上的 PHP 5.2.17,文件已从 Windows 机器上载。目前,我只测试了 2-3 个图像,将它们硬编码到一个测试 PHP 文件中。如果从数据库查询中提取文件名,您认为会有所不同吗?

4

2 回答 2

1

URL 不太可能在其中使用文字多字节字符。您需要通过它们urlencode()才能获得合理的结果。

例如

$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>
于 2012-07-11T10:21:35.430 回答
0

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

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

大多数 Linux 机器在 shell 或本地桌面中显示时将它们的文件名解释为 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 编码。

于 2012-07-11T21:29:59.217 回答