Как удалить% EF% BB% BF в строке PHP - PullRequest
3 голосов
/ 30 октября 2010

Я пытаюсь использовать Microsoft Bing API.

$data = file_get_contents("http://api.microsofttranslator.com/V2/Ajax.svc/Speak?appId=APPID&text={$text}&language=ja&format=audio/wav");
$data = stripslashes(trim($data));

Возвращенные данные имеют символ '' в первом символе возвращаемой строки. Это не пробел, потому что я обрезал его перед возвратом данных.

Символ '' оказался% EF% BB% BF.

Интересно, почему это произошло, может быть, ошибка от Microsoft?

Как я могу удалить этот% EF% BB% BF в PHP?

Ответы [ 7 ]

17 голосов
/ 30 октября 2010

Вы не должны просто сбрасывать BOM, если вы не уверены на 100%, что поток будет: (a) всегда будет UTF-8 и (b) всегда будет иметь UTF-8.

Причины:

  1. В UTF-8 спецификация необязательна - поэтому, если служба прекратит посылать ее в какой-то момент в будущем, вы вместо этого выбросите первые три символа своего ответа.
  2. Вся цель спецификации состоит в том, чтобы однозначно определить тип интерпретируемого потока UTF UTF-8? -16? или -32 ?, а также для указания 'endian-ness' (порядка байтов) кодированной информации. Если вы просто выбросите его, вы предполагаете, что вы всегда получаете UTF-8; это может быть не очень хорошим предположением.
  3. Не все спецификации имеют длину 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);
5 голосов
/ 14 августа 2013

$data = file_get_contents("http://api.microsofttranslator.com/V2/Ajax.svc/Speak?appId=APPID&text={$text}&language=ja&format=audio/wav");<br> $data = stripslashes(trim($data));

if (substr($data, 0, 3) == "\xef\xbb\xbf") {<br> $data = substr($data, 3);<br> }

2 голосов
/ 30 октября 2010

Это знак порядка байтов (BOM), указывающий, что ответ закодирован как UTF-8 .Вы можете безопасно удалить его, но вы должны проанализировать остаток как UTF-8.

0 голосов
/ 10 июля 2013

У меня была такая же проблема сегодня, и она была исправлена, поскольку строка была установлена ​​в UTF-8:

http://php.net/manual/en/function.utf8-encode.php

$ content = utf8_encode ($ content);

0 голосов
/ 30 октября 2010

$data = str_replace('%EF%BB%BF', '', $data);

Вы, вероятно, не должны использовать stripslashes - если API не возвращает данные с черными чертами (и вероятность 99,99%, что нет), уберите этот вызов.

0 голосов
/ 30 октября 2010

Вы можете использовать substr только для получения остатка без UTF-8 BOM :

// if it’s binary UTF-8
$data = substr($data, 3);
// if it’s percent-encoded UTF-8
$data = substr($data, 9);
0 голосов
/ 30 октября 2010

Чтобы удалить его из начала строки (только):

$data = preg_replace('/^%EF%BB%BF/', '', $data);
...