Вопрос

Я пытаюсь использовать Microsoft Промежуток 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?

Это было полезно?

Решение

Вы могли бы использовать 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);

Другие советы

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

Причины:

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

$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));

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

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

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

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

$ CONTENT = UTF8_ENCODE ($ CONTENT);

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top