سؤال

أحاول استخدام 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);

نصائح أخرى

يجب ألا تتجاهل ببساطة BOM إلا إذا كنت متأكدًا بنسبة 100 ٪ من أن الدفق سوف: (أ) يكون دائمًا UTF-8 ، و (ب) دائمًا لديك UTF-8 BOM.

الأسباب:

  1. في UTF-8 ، BOM هو اختياري - لذلك إذا تركت الخدمة إرسالها في نقطة مستقبلية ، فسوف تخلص من الأحرف الثلاثة الأولى من ردك بدلاً من ذلك.
  2. الغرض كله من BOM هو تحديد نوع دفق UTF الذي يتم تفسيره UTF-8 بشكل لا لبس فيه؟ -16؟ أو -32؟ ، وأيضًا للإشارة إلى "ترتيب البايت" (ترتيب البايت) للمعلومات المشفرة. إذا قمت فقط بإلقاءها ، فأنت تفترض أنك تحصل دائمًا على UTF-8 ؛ قد لا يكون هذا افتراضًا جيدًا جدًا.
  3. ليس كل BOMs طوله 3-BYTES ، فقط 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