0

解決:

    $output = '–– € ––'; 
//written like this php 5 does not understand because it interprets it as single-byte chars.
//so i found the function below to write a multi-byte char in a string.

//unicode version of php's chr()
function uchr ($codes) {
    if (is_scalar($codes)) $codes= func_get_args();
    $str= '';
    foreach ($codes as $code) $str.= html_entity_decode('&#'.$code.';',ENT_NOQUOTES,'UTF-8');
    return $str;
}

//decimal values of unicode chars: – 8211 - 8211, [space] 32, € 8364,[space] 32, – 8211 - 8211
$output = uchr(8211,8211,32,8364,32,8211,8211);

//or
$output = uchr(8211,8211).' '.uchr(8364).' '.uchr(8211,8211);

echo $output;

質問:

これらの特別な文字を単純なファイルに書き込むにはどうすればよいですか?

$file = "./upload/myfile.txt";
$output = "–– € ––".PHP_EOL; // the "–" is not an underscore _ or - but –
file_put_contents($file, $output);

ブラウザhttp://mydomain.com/upload/myfile.txtからこのファイルにアクセスすると、「�」文字しか表示されません。

ただし、Zend Developerまたはローカルのテキストエディタ(OSX上)で「-€-」を保存してアップロードすると、すべて問題ありません。ブラウザはそれを正しく表示します。

どうすればphpでこれを達成できますか?phpは私のmacbookとは異なるファイルの書き方を使用しているようです。phpの標準はUTF-8だと思い、ローカルのテキストエディタでファイルをUTF-8として保存しました。

追加情報:私が書いたアップロードフォルダにある.htaccessファイルに:

  AddDefaultCharset utf-8
  AddCharset utf-8 .txt

それ以外の場合、firefoxのfirebugアドオンは、文字セットが指定されていないというメッセージを表示しました。

何か案は?アップロードしたファイルが正しく表示されるため、ファイルの保存と関係があります。

次のようにファイルを保存しながら、さまざまなオプションを試しました。

$output = mb_convert_encoding($output, 'UTF-8', 'OLD-ENCODING');

とphpのiconv関数ですが、解決策が見つかりません。

どんな助けでも大歓迎です。

編集:アップロードしたファイルからコンテンツを取得してエコーすると、次のようになります

$output = file_get_contents('./upload/myuploadedfile.txt',FILE_USE_INCLUDE_PATH); 
//it show correctly –– € ––
$output = $output[1]; //it shows a �
$output = $output[3]; //it shows a �

echo $output;
4

1 に答える 1

1

PHPは、ファイルの内容をソースコードとまったく同じように書き込みます。.phpファイルにエンコードされているとおりにバイトを取り、ファイルに入れます。それ以降は、ファイルの解釈方法によって異なります。ソースコードが実際にUTF-8でエンコードされていると仮定すると、ファイルもそうなります。UTF-8を理解できるテキストエディタで開いてみてください。ブラウザが解釈するエンコーディングをUTF-8に変更します([表示]メニュー> [エンコーディング])。Webサーバーをブラウザーで開いたときに、Webサーバーが実際に正しい文字セットヘッダーを設定しているかどうかを確認します([Firebugネットワーク]タブ、応答のヘッダー)。

$output[0]PHPはマルチバイト文字「–」の最初のバイトしか提供しないため、UTF-8文字が壊れていることを示しているのは正しいことです。

より詳細な情報については、すべてのプログラマーがテキストを操作するためのエンコーディングと文字セットについて絶対に、積極的に知っておく必要があることを参照してください。

于 2012-12-04T19:25:14.443 に答える