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マシンからアップロードされています。現在、テストPHPファイルにハードコーディングして2〜3枚の画像のみをテストしました。ファイル名がデータベースクエリから取得された場合は異なると思いますか?

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 ボックスの大部分は、シェルまたはローカル デスクトップに表示されるときにファイル名を UTF-8 として解釈するため、これは合理的な選択であり、IRI も常に UTF-8 です。ブラウザのアドレスバー、それが目的のエンコーディングです。その場合、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 に答える