web-dev-qa-db-ja.com

fwrite()およびUTF8

私はphpfwrite()を使用してファイルを作成しており、すべてのデータがUTF8にあることを知っています(これについて広範なテストを行いました-データをdbに保存し、通常のWebページに出力すると、すべて正常に機能し、utf8として報告されます)。出力しているファイルにutf8以外のデータが含まれていると言われています:(ファイルの形式をチェックするコマンドがbash(CentOS)にありますか?

Vimを使用すると、コンテンツは次のように表示されます。

何もしないでください....それはすべてを備えた素晴らしいサイトです....私たちは立ち上げたばかりです/

ファイルがUTF8であることを確認するか、utf8コンテンツをファイルに書き込む方法を教えてください。

[〜#〜] update [〜#〜]

UTF8にデータがあることをどのように知っているかを明確にするために、次のことを行いました。

  1. データを保存するときにDBがutf8に設定されている
  2. データベースに私はこれを最初に実行します:

    $enc = mb_detect_encoding($data);

    $data = mb_convert_encoding($data, "UTF-8", $enc);

  3. Fwriteを実行する直前に、データを各データが 'IS utf-8'を返すことに注意してくださいでデータをチェックしました。

    if (strlen($data)==mb_strlen($data, 'UTF-8')) print 'NOT UTF-8'; else print 'IS utf-8';

ありがとう!

10
Lizard

データが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でエンコードされていることを知っているとあなたが言ったように)。

26
Florin Sima

fwrite() はバイナリセーフではありません。つまり、データが正しくエンコードされているかどうかに関係なく、このコマンドまたはその基になるルーチンによってデータが破損する可能性があります。

安全のために、バイナリモードフラグとともに fopen() を使用する必要があります。それはbです。その後、fwrite()は文字列データを「現状のまま」保護します。これは、PHPの文字列がバイナリ文字列であるため、これまではPHPにあります。

背景:一部のシステムはテキストデータとバイナリデータで異なります。バイナリフラグは、そのようなシステムでバイナリ出力を使用するように明示的にPHPに命令します。 UTF-8を扱うときは、データが乱雑にならないように注意する必要があります。これは、文字列データをバイナリデータとして処理することで防止されます。

ただし:データのUTF-8エンコーディングが保持されていると質問で言ったのとは異なる場合は、エンコーディングが壊れており、バイナリセーフ処理でも壊れた状態が維持されます。ただし、バイナリフラグを使用すると、これがアプリケーションのfwrite()部分で問題を引き起こしていないことを確認できます。

ここで別の答えに正しく書かれているのは、データしかない場合はエンコーディングがわからないということです。ただし、UTF-8エンコーディングを検証するかどうかに関係なくデータを検証できるため、少なくともエンコーディングを確認する機会が与えられます。これを行うPHPの関数は、UTF-8関連の質問に投稿したので、デバッグが必要な場合に役立つ可能性があります。 回答:SimpleXMLおよび中国語can_be_valid_utf8_statemachineを探します。これが関数の名前です。

6
hakre

問題は、データが二重にエンコードされていることです。元のテキストは次のようなものだと思います。

何もしないで

、つまり、まっすぐなアポストロフィではなく、 右一重引用符

このコンテンツを使用してUTF-8でエンコードされたPHPスクリプトを作成する場合:

<?php
//File in UTF-8
echo utf8_encode("Don’t"); //this will double encode

出力に似たものが得られます。

2
Artefacto
$handle = fopen($file,"w");
fwrite($handle, pack("CCC",0xef,0xbb,0xbf));
fwrite($handle,$file); 
fclose($handle);
1
steffanjj
//add BOM to fix UTF-8 in Excel
fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));

私はこの作品が私のために働くと思います:)

1
Du Peng

_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';
_

0
OZ_