Я пытаюсь использовать 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?
Вы можете использовать substr
для получения всего остального без спецификации UTF-8 :
// if it's binary UTF-8 $data = substr($data, 3); // if it's percent-encoded UTF-8 $data = substr($data, 9);
Вы не должны просто отбрасывать спецификацию, если вы на 100% не уверены, что поток будет: (а) всегда быть UTF-8 и (b) всегда иметь спецификацию UTF-8.
Причины:
Я думаю, что более подходящим способом справиться с этим было бы что-то вроде:
/* 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% – это не так), вызовите этот вызов.