Вы не должны просто сбрасывать BOM, если вы не уверены на 100%, что поток будет: (a) всегда будет UTF-8 и (b) всегда будет иметь UTF-8.
Причины:
- В UTF-8 спецификация необязательна - поэтому, если служба прекратит посылать ее в какой-то момент в будущем, вы вместо этого выбросите первые три символа своего ответа.
- Вся цель спецификации состоит в том, чтобы однозначно определить тип интерпретируемого потока UTF UTF-8? -16? или -32 ?, а также для указания 'endian-ness' (порядка байтов) кодированной информации. Если вы просто выбросите его, вы предполагаете, что вы всегда получаете UTF-8; это может быть не очень хорошим предположением.
- Не все спецификации имеют длину 3 байта, только одна UTF-8 имеет три байта. UTF-16 - это два байта, а UTF-32 - четыре байта. Поэтому, если в будущем сервис переключится на более широкую кодировку UTF, ваш код сломается.
Я думаю, что более подходящим способом справиться с этим было бы что-то вроде:
/* Detect the encoding, then convert from detected encoding to ASCII */
$enc = mb_detect_encoding($data);
$data = mb_convert_encoding($data, "ASCII", $enc);