私はphpfwrite()を使用してファイルを作成しており、すべてのデータがUTF8にあることを知っています(これについて広範なテストを行いました-データをdbに保存し、通常のWebページに出力すると、すべて正常に機能し、utf8として報告されます)。出力しているファイルにutf8以外のデータが含まれていると言われています:(ファイルの形式をチェックするコマンドがbash(CentOS)にありますか?
Vimを使用すると、コンテンツは次のように表示されます。
何もしないでください....それはすべてを備えた素晴らしいサイトです....私たちは立ち上げたばかりです/
ファイルがUTF8であることを確認するか、utf8コンテンツをファイルに書き込む方法を教えてください。
[〜#〜] update [〜#〜]
UTF8にデータがあることをどのように知っているかを明確にするために、次のことを行いました。
データベースに私はこれを最初に実行します:
$enc = mb_detect_encoding($data);
$data = mb_convert_encoding($data, "UTF-8", $enc);
Fwriteを実行する直前に、データを各データが 'IS utf-8'を返すことに注意してくださいでデータをチェックしました。
if (strlen($data)==mb_strlen($data, 'UTF-8')) print 'NOT UTF-8'; else print 'IS utf-8';
ありがとう!
データがUTF8にあることがわかっている場合は、ヘッダーを設定します。
私は別のトレッドに答える解決策を書きました。
解決策は次のとおりです。UTF-8のバイトオーダーマークは\xef\xbb\xbf
ドキュメントのヘッダーに追加する必要があります。
<?php
function writeStringToFile($file, $string){
$f=fopen($file, "wb");
$file="\xEF\xBB\xBF".$file; // this is what makes the magic
fputs($f, $string);
fclose($f);
}
?>
あなたはそれをあなたのコードに適応させることができます、基本的にあなたはあなたがUTF8ファイルを書くことを確認したいだけです(あなたがあなたのコンテンツがUTF8でエンコードされていることを知っているとあなたが言ったように)。
fwrite()
はバイナリセーフではありません。つまり、データが正しくエンコードされているかどうかに関係なく、このコマンドまたはその基になるルーチンによってデータが破損する可能性があります。
安全のために、バイナリモードフラグとともに fopen()
を使用する必要があります。それはb
です。その後、fwrite()
は文字列データを「現状のまま」保護します。これは、PHPの文字列がバイナリ文字列であるため、これまではPHPにあります。
背景:一部のシステムはテキストデータとバイナリデータで異なります。バイナリフラグは、そのようなシステムでバイナリ出力を使用するように明示的にPHPに命令します。 UTF-8を扱うときは、データが乱雑にならないように注意する必要があります。これは、文字列データをバイナリデータとして処理することで防止されます。
ただし:データのUTF-8エンコーディングが保持されていると質問で言ったのとは異なる場合は、エンコーディングが壊れており、バイナリセーフ処理でも壊れた状態が維持されます。ただし、バイナリフラグを使用すると、これがアプリケーションのfwrite()
部分で問題を引き起こしていないことを確認できます。
ここで別の答えに正しく書かれているのは、データしかない場合はエンコーディングがわからないということです。ただし、UTF-8エンコーディングを検証するかどうかに関係なくデータを検証できるため、少なくともエンコーディングを確認する機会が与えられます。これを行うPHPの関数は、UTF-8関連の質問に投稿したので、デバッグが必要な場合に役立つ可能性があります。 回答:SimpleXMLおよび中国語can_be_valid_utf8_statemachineを探します。これが関数の名前です。
問題は、データが二重にエンコードされていることです。元のテキストは次のようなものだと思います。
何もしないで
’
、つまり、まっすぐなアポストロフィではなく、 右一重引用符
このコンテンツを使用してUTF-8でエンコードされたPHPスクリプトを作成する場合:
<?php
//File in UTF-8
echo utf8_encode("Don’t"); //this will double encode
出力に似たものが得られます。
$handle = fopen($file,"w");
fwrite($handle, pack("CCC",0xef,0xbb,0xbf));
fwrite($handle,$file);
fclose($handle);
//add BOM to fix UTF-8 in Excel
fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
_I know all my data is in UTF8
_-間違っています。
エンコードはファイルの形式ではありません。したがって、データを取得するページのヘッダーの文字セットを確認してください。header("Content-type: text/html; charset=utf-8;");
そして、データが本当にマルチバイトエンコーディングであるかどうかを確認します。
_if (strlen($data)==mb_strlen($data, 'UTF-8')) print 'not UTF-8';
_
else print 'utf-8';