人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

UTF-8でBOMありで保存されたテキストファイルが複数あり、それらのファイルを連結し1つにまとめたファイルがあるとします。

その場合、先頭とファイル中に2つ以上BOMが存在することになり、PHPでファイル内のBOMを全て除去したいのですが、単純に以下の処理を行っても問題ないのでしょうか?

$str = str_replace("\xef\xbb\xbf", '', $str);

問題があるとすれば、代替案も提示して頂けると有り難いです。
宜しくお願いします。

●質問者: wankodon
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● cawbridge2013
●33ポイント

googleで「php BOM 除去」または「pho BOM 削除」で検索するといいよ。

みんなBOM削除を1つの機能として見なして関数にして分けてる。

PHPでUTF-8のBOMを削除する方法
http://unsolublesugar.com/20120919/223812/

1機能を1行書きするのはナンセンスだと思う。


a-kuma3さんのコメント
検索で引っかかるのは先頭についている BOM の除去ばかり(回答で引用したリンクも同様)。 質問者は、ファイルの途中に入ってる BOM を除去したいんだ、と質問しているのですよ。 質問文に書かれた単語だけに反応して悦に入ってるなんて、それこそ<b>ナンセンス</b>です。

tezcelloさんのコメント
> ファイルの途中に入ってる BOM を除去したいんだ、と質問している 質問文には「ファイル内のBOMを全て除去したい」とありますけど?

wankodonさんのコメント
残念ながらネット上のものは先頭BOMの除去だけのものが多くて。 こちらが意図してるのはa-kuma3さんが仰るように先頭だけでなく、ファイルの途中のBOMも削除したいのです。説明の書き方が悪かったら申し訳ありません。

2 ● tezcello
●33ポイント

> 単純に以下の処理を行っても問題ないのでしょうか?
「ファイル内のBOMを全て除去したい」との事ですから問題ないハズです。

もしも「途中に入っているBOM」であるなら、アレコレやるより全部削除しておいて先頭に付け足すのが一番お手軽では?
わざわざ str_replace() よりも高コストの正規表現でやる必要もないですから。


wankodonさんのコメント
結合前にBOMの除去を行えば一番よいのですが、それは行えない前提でお願いします。

tezcelloさんのコメント
BOM付のUTF-8なファイルを単純に連結したファイルがあるという前提で書きましたが、何か不都合な所がありましたか? str_replace() は与えた文字列中の全ての対象文字列を置換してくれますから、目的に適っていると思うのですけど? 単純にそのファイルを読み出して str_replace() で全ての BOM を削除したうえで保存(同名で上書きでも、別名で新規でもお好きな方で)すれば問題ないです。

wankodonさんのコメント
なるほど。文章を読み違えてました。失礼しました。 遅れましたが回答有り難うございます。

3 ● a-kuma3
●34ポイント ベストアンサー

0xBBBF は、ハングルにマッピングされているエリアです。
Unicode一覧 B000-BFFF - Wikipedia

第2バイトに、0xEF がくる文字も当然あります。

0xBBBF → 뮿
0xBBEF 0xBBBF → 믯뮿


扱っているテキストファイルに、ハングルが入ってないことが保証されているのであれば、機械的に 3byte を削除して問題ないと思います。


practicalschemeさんのコメント
それはUnicode codepoint。utf-8でエンコーディングされるとそれぞれEB AE BF、EB AF AF になるのでかぶりません。

a-kuma3さんのコメント
あ、そうか。Unicode を UTF-8 で符号化するんでしたっけ。 0xEF 0xBB 0xBF を、UTF-8 の U+0800 ? U+FFFF で、符号化をほどくと FE FF になるから、該当する文字がないので被らない、ということでよろしい? > id:practicalscheme さん

practicalschemeさんのコメント
はい。utf-8は符号化したオクテット列の途中からが別の符号化オクテット列と一致することがないように設計されてます。BOM (U+feff)には一応zero-width no-break spaceという文字が割り当てられていますが、現状ではその目的で文書中に現れることは無いとみなしてよいと思います (厳密に仕様に従うなら、文書途中でゼロ幅非改行空白として使われる可能性を考慮しないとならないですが、当のUnicode自身がその使い方を非推奨にしてますんで)。 もともとの質問についてはphpの文字列操作関数が文字列をどう扱っているか知らないので答えられないのですが、単なるオクテット列とみなしているならEF BB BFを削除するので問題ないと思います。

wankodonさんのコメント
質問者です。 削除は特に問題ないようでよかったです。 お二方どうも有り難うございました。勉強になります。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ