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


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

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

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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/11/28 18:41:54
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.3

回答回数4974ベストアンサー獲得回数2154

ポイント34pt

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

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

0xBBBF → 뮿
0xBBEF 0xBBBF → 믯뮿


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

他2件のコメントを見る
id:practicalscheme

はい。utf-8は符号化したオクテット列の途中からが別の符号化オクテット列と一致することがないように設計されてます。BOM (U+feff)には一応zero-width no-break spaceという文字が割り当てられていますが、現状ではその目的で文書中に現れることは無いとみなしてよいと思います (厳密に仕様に従うなら、文書途中でゼロ幅非改行空白として使われる可能性を考慮しないとならないですが、当のUnicode自身がその使い方を非推奨にしてますんで)。

もともとの質問についてはphpの文字列操作関数が文字列をどう扱っているか知らないので答えられないのですが、単なるオクテット列とみなしているならEF BB BFを削除するので問題ないと思います。

2013/11/27 11:00:05
id:wankodon

質問者です。
削除は特に問題ないようでよかったです。
お二方どうも有り難うございました。勉強になります。

2013/11/28 18:40:21

その他の回答2件)

id:cawbridge2013 No.1

回答回数174ベストアンサー獲得回数17

ポイント33pt

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

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

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

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

他1件のコメントを見る
id:tezcello

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

2013/11/26 01:33:11
id:wankodon

残念ながらネット上のものは先頭BOMの除去だけのものが多くて。

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

2013/11/26 05:34:15
id:tezcello No.2

回答回数460ベストアンサー獲得回数69

ポイント33pt

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

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

他1件のコメントを見る
id:tezcello

BOM付のUTF-8なファイルを単純に連結したファイルがあるという前提で書きましたが、何か不都合な所がありましたか?

str_replace() は与えた文字列中の全ての対象文字列を置換してくれますから、目的に適っていると思うのですけど?

単純にそのファイルを読み出して str_replace() で全ての BOM を削除したうえで保存(同名で上書きでも、別名で新規でもお好きな方で)すれば問題ないです。

2013/11/26 14:17:38
id:wankodon

なるほど。文章を読み違えてました。失礼しました。
遅れましたが回答有り難うございます。

2013/11/28 18:36:23
id:a-kuma3 No.3

回答回数4974ベストアンサー獲得回数2154ここでベストアンサー

ポイント34pt

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

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

0xBBBF → 뮿
0xBBEF 0xBBBF → 믯뮿


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

他2件のコメントを見る
id:practicalscheme

はい。utf-8は符号化したオクテット列の途中からが別の符号化オクテット列と一致することがないように設計されてます。BOM (U+feff)には一応zero-width no-break spaceという文字が割り当てられていますが、現状ではその目的で文書中に現れることは無いとみなしてよいと思います (厳密に仕様に従うなら、文書途中でゼロ幅非改行空白として使われる可能性を考慮しないとならないですが、当のUnicode自身がその使い方を非推奨にしてますんで)。

もともとの質問についてはphpの文字列操作関数が文字列をどう扱っているか知らないので答えられないのですが、単なるオクテット列とみなしているならEF BB BFを削除するので問題ないと思います。

2013/11/27 11:00:05
id:wankodon

質問者です。
削除は特に問題ないようでよかったです。
お二方どうも有り難うございました。勉強になります。

2013/11/28 18:40:21
  • id:fiwa
    こんな話?
    http://stackoverflow.com/questions/9100728/remove-multiple-boms-from-a-file
  • id:wankodon
    英語は苦手なのですが、たぶんその話だと思います。
    有り難うございます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません