Intereting Posts
Сохранение выбранного элемента в поле выбора после отправки Проблема сортировки массива в PHP Обнаружение просматриваемой страницы из url в wordpress Пустое содержимое потока PHP SSH2, даже с stream_set_blocking? PHP получить pdf-файл из базы данных с кодировкой base64 Расширение синглотонов в PHP Синтаксис для инструкции if / else, если вставка была успешной в подготовленном заявлении PDO Предотвращение таймаута во время большого запроса в PHP Как включить загрузку gif во время загрузки файла и вставки в базу данных Как выходить из системы с помощью Facebook Connect в PHP и Zend? Публикация изображения + статус с помощью API Twitter с помощью php Как переименовать загруженный файл, прежде чем сохранять его в каталог? sqlite не работает Как передать значение с сайта android на веб-службу php и получить его? Как лучше всего читать, а затем перезаписывать содержимое файла в php?

Как удалить% EF% BB% BF в строке PHP

Я пытаюсь использовать 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.

    Причины:

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

    $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% – это не так), вызовите этот вызов.