ど素人から毛を生やす。<延>

文字列をUTF-8に変換、UTF-8BOMだったらBOMを取る。

Web > PHP 2021年8月26日(最終更新:2年前)

2021年8月26日に作成されたページです。
情報が古かったり、僕が今以上のど素人だった頃の記事だったりする可能性があります。

某所からDLしたTSVファイルがさあ!
SJISだったりUTF-8だったりUTF-8BOMだったりころっころ文字セット変えてくるのよ! 断りなく!!

ということで、文字セットを判別してUTF-8に変換、UTF-8BOMだったらBOMを取るだけの関数備忘録。

function utf8encode($str, $original_encode_list = array('UTF-8', 'SJIS-win', 'SJIS')){	
	$original_encode = mb_detect_encoding($str, $original_encode_list);
	
	if($original_encode=='UTF-8'){
		// UTF-8 BOM付き
		if (preg_match('/^[\x0x\xef][\x0x\xbb][\x0x\xbf]/', $str)) {
			// BOM付きからBOM無しへ
			$str = substr($str, 3);
		}
	}else if($original_encode!==false){
		$str = mb_convert_encoding($str, 'UTF-8', $original_encode);
	}else{
		//想定外の文字セットが検出された? 英語ファイルかな? そのまま返せばいいや。
	}
	
	return $str;
}

そもそもBOMってなに?

A.Unicode系文字列の先頭数バイトに、「これはUTF-○ですよ」と示すための符号がくっついていること。
 バイトオーダーマーク(byte order mark)の略だそう。

ソフトウェアによっては、このBOMが無いと文字セットが判別できないものがある一方、PHP等のウェブ言語では逆にこのBOM符号がよく分からんものとして持て余すらしいです。

で、UTF-8のBOMは「0xEF 0xBB 0xBF」なので、これが感知できた場合は先頭3バイトを取っ払えばOK。

今回はSJISかUTF-8かUTF-8BOMかの選択肢だったのでこうなっていますが、他の文字セットやUTFの可能性がある場合は同様の要件で追記していけば良いです。

参考サイト

UX MILK[UTF-8のBOM付き・BOM無しの違いと確認方法]
私的雑録[UTF8 BOM付き、BOM無し判定]

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)