web-dev-qa-db-ja.com

PHPで文字65279をエコーし​​ないようにするにはどうすればよいですか?

同様の問題が発生しました here (および他の場所)-ajaxコールバックの場合、問題ないように見えるxmlhttp.responseTextを取得します(警告すると-適切なテキストが表示されます)-しかし、 'if'ステートメントを使用して文字列と比較する場合、falseを返します。

(私は、その文字列を返すサーバー側コードを書いた人でもあります)-文字列をよく調べた結果、文字列の最初の文字が「見えない文字」であることがわかりました。表示されなかった文字。メモ帳にコピーして-最初の文字を削除すると-もう一度Deleteキーを押すまで削除されません。

Xmlhttp.responseTextで返された文字列に対してcharCodeAt(0)を実行しました。そして、65279を返しました。

それをグーグルで調べると、「ビッグエンディアン」または「スモールエンディアン」エンコーディングを設定することになっているのは何らかのUTF-8制御文字であることがわかります。

だから、今私は問題の原因を知っています-しかし...なぜそのキャラクターがエコーされていますか?ソースPHPでは、私は単に使用します

echo 'the string'...

そしてどうやらどうやら[chr(65279)]文字列を出力します...

どうして?そして、どうすればそれを回避できますか?

33
Yuval A.

結論として、ソリューションを指定するには:

Windowsメモ帳は、utf-8エンコードで保存されたファイルにBOM文字(3バイト:EF BB BF)を追加します。

PHPは、1つのphpファイルを別のphpファイルに含めない限り、煩わされることはないようです。その場合、物事が乱雑になり、文字列の先頭にcharacter(65279)が表示されます。

Notepad ++などの別のテキストエディターでファイルを編集し、エンコードを使用できます。
「BOMなしのUTF-8でエンコード」、
これで問題は解決したようです。

また、メモ帳でANSIエンコードを使用して他のphpファイルを保存することもできます-これも機能するようです(つまり、ファイルで実際に拡張文字を使用しない場合は...)

78
Yuval A.

ZERO WIDTH NO-BREAK SPACE charを含む文字列を印刷する場合(たとえば、外部の非PHPファイルを含めることにより)、次のコードを試してください:

echo preg_replace("/\xEF\xBB\xBF/", "", $string);
4
matfax

LinuxまたはMacを使用している場合は、PHPの文字を削除するエレガントなソリューションを以下に示します。

WordPress(インターネットWebサイトの25%はWordPressを使用)を使用している場合、プラグインまたはアクティブなテーマがBOMを含むファイルによりBOMキャラクターを導入している可能性があります(おそらくファイルがWindowsで編集された場合)。その場合は、wp-content/themes /フォルダーに移動し、次のコマンドを実行します。

grep -rl $'\xEF\xBB\xBF' .

これにより、BOMでファイルが検索されます。リストに.phpの結果がある場合は、次を実行します。

  1. ファイルの名前をfilename.bom.bak.phpのような名前に変更します
  2. エディターでファイルを開き、クリップバードのコンテンツをコピーします。
  3. 新しいファイルを作成し、クリップボードからコンテンツを貼り付けます。
  4. 元の名前filename.phpでファイルを保存します

これをローカルで処理している場合、最終的には新しいファイルをサーバーに再アップロードする必要があります。

Grepコマンドの実行後に結果が得られず、WordPressを使用している場合、BOMファイルを確認する別の場所は/ wp-content/pluginsフォルダーです。そこに行き、コマンドを再度実行します。または、すべてのプラグインの非アクティブ化を開始し、プラグインを再度アクティブにしている間に問題が解決したかどうかを確認できます。

WordPressを使用していない場合は、プロジェクトフォルダーのルートに移動し、コマンドを実行してBOMでファイルを検索します。ファイルが見つかった場合は、上記の4つの手順を実行します。

4
julianm

次の方法でjavascriptの文字を削除することもできます。

myString = myString.replace(String.fromCharCode(65279), "" );

3
Tiago A.

この問題が発生し、bom、Ansiなどを使用せずにエンコードをutf-8に変更しました。私の問題は、html本体でphp include関数を使用したことが原因でした。 include関数をhtmlの上(!DOCTYPEタグの上)に移動すると、問題は解決しました。

テストした問題を知った後、include、include_once、require関数をテストしました。 html本文内からファイルをインクルードしようとするすべての試みは、PHPコードが開始される場所に余分なmis文字を作成しました。

また、インクルードの結果を変数に割り当てようとしました...つまり、$ result = include( "myfile.txt");同じ追加の文字が追加されます

HTMLの上にインクルードを移動しても、余分な文字は表示から削除されませんが、データからコンテンツ領域から削除されます。

2
user1156978

「Dreamweaver CC 2015」を使用します。デフォルトでは、このオプションが有効になっています。「BOM署名を含める」など、ファイルメニューから[名前を付けて保存]をクリックすると表示されます。表示されるウィンドウに、「Unicodeオプション...」が表示されます。 BOMオプションを無効にできます。そして、そのようなすべてのファイルを変更することを忘れないでください。または、単に設定に移動してBOMオプションを無効にし、すべてのファイルを保存することができます。

1
phpWarrior

上記に加えて、MySQLデータベースから一部のデータをプルするときにこの問題が発生しました(charsetはUTF-8に設定されます)-HTMLタグである問題は、<p>や<a>などの基本的なものを許可しましたページに表示したところ、ChromeのDev Toolsを通して&#65729キャラクターが見えました。

そこで、テーブルからタグを削除し、&#65729の問題(およびテキストが表示される場所の上にある空白行)を削除しました。

私の担当者は答えに実際にコメントするほど高くないので、これに追加したかっただけです。

編集:VIMを使用すると、_:set nobomb_でBOMを削除することができ、bombまたはnobombのいずれかを表示する_:set bomb?_でBOMの存在を確認できます。

1
James Groves

おそらくサーバー上の何か。存在することがわかっている場合は、解決するまでバイパスします。

myString = myString.substring(1)

最初の文字を切り落とします。

0
Drazisil

この文字を見つけてファイルから削除するLinuxソリューションは、sed -i 's/\xEF\xBB\xBF//g' your-filename-hereを使用することです

0
Richard

私の解決策は、コンテンツを含むphpファイルを作成することです。

<?php
header("Content-Type:text/html;charset=utf-8");
?>

ANSIとして保存すると、他のphpファイルはhtmlまたはphpコードの前にこれを要求/インクルードします

0
Trần Hoàn

atomを使用する場合、ドキュメントの先頭の<?phpの前の空白です。

0
Renoir Reis