PHP服务器上Android应用程序中JSON前的奇怪符号

PHP服务器上Android应用程序中JSON前的奇怪符号,php,android,json,Php,Android,Json,当我试图从PHP服务器解析Android应用程序中的JSON时,出现了这个错误 此错误我得到: 05-26 14:38:44.963: D/TAG(31618): test u try 05-26 14:38:44.968: W/System.err(31618): org.json.JSONException: Value ?»??»? of type 05-26 14:38:44.963: D/TAG(31618): test u try 05-26 14:38:44.968:

当我试图从PHP服务器解析Android应用程序中的JSON时,出现了这个错误

错误我得到:

05-26 14:38:44.963: D/TAG(31618): test u try
05-26 14:38:44.968: W/System.err(31618): org.json.JSONException: Value ?»??»? of type        05-26 14:38:44.963: D/TAG(31618): test u try
05-26 14:38:44.968: W/System.err(31618): org.json.JSONException: Value ?»??»? of type java.lang.String cannot be converted to JSONObject
这里是我从PHP服务器获得的JSON,正如您所看到的,JSON前面有一些奇怪的字符

这里是JSON

?»??»?{
   "horoscope":[
      {
         "name_sign":"Ovan",
         "txt_hrs":"Neke promene koje ste ve\u0107 izvesno vreme izbegavali, danas dolaze na dnevni red. Mogu\u0107e je da \u0107ete imati priliku da promenite mesto stanovanja ili posao. Tako\u0111e, pred vama je jedno kra\u0107e putovanje koje nikako ne biste smeli da propustite. O\u010dekuje vas manji problem sa respiratornim sistemom.  Prekontroli\u0161ite krvnu sliku."
      },
      {
         "name_sign":"Bik",
         "txt_hrs":"Pobolj\u0161anje u komunikaciji donosi pobolj\u0161anja na poslovnom planu. Veoma je mogu\u0107e da \u0107ete danas \u010duti neke pozitivne vesti vezane za napredovanje u karijeri. Emotivni odnosi se tako\u0111e pobolj\u0161avaju. Partner i vi kona\u010dno pronalazite zajedni\u010dki jezik."
      },
      {
         "name_sign":"Blizanci",
         "txt_hrs":"Mogu\u0107e je da danas budete nervozniji nego ina\u010de i pomalo deprimirani, a sve kao rezultat odvojenosti od voljenog bi\u0107a. Ne bi bilo lo\u0161e da se neko vreme posvetite poslovnim projektima, naro\u010dito onima koji zahtevaju izvesnu dozu kreativnosti. Bi\u0107ete zadovoljni postignutim rezultatima, a i vreme \u0107e vam znatno br\u017ee prote\u0107i."
      },
      {
         "name_sign":"Rak",
         "txt_hrs":"Iznenadna poseta bliske osobe koja je zapala u izvesne probleme, menja vam uobi\u010dajenu rutinu i ostavlja vas zate\u010denim. Ne mo\u017eete da prihvatite da se ovako ne\u0161to de\u0161ava va\u0161im dragim ljudima. Pa ipak, najbitnije je da joj ne sudite i da pru\u017eite punu emotivnu podr\u0161ku. Tako\u0111e, o\u010dekuju vas povoljne vesti iz inostranstva."
      },
      {
         "name_sign":"Lav",
         "txt_hrs":"Neo\u010dekivani susret sa voljenim bi\u0107em ili jednom mla\u0111om osobom ostavlja vas u prijatnom raspolo\u017eenju i veri u bolju budu\u0107nost. Nastojte da vi\u0161e vremena provedete sa njom. Danas biste tako\u0111e mogli da budete u prilici da po\u0161aljete mnogo pisama, mejlova ili obavite mnogo telefonskih razgovora. O\u010dekuju vas dobre vesti od jednog \u010dlana porodice."
      },
      {
         "name_sign":"Devica",
         "txt_hrs":"Neke stvari koje su van va\u0161e kontrole \u010dine vas frustriranim i punim negativne energije. Da biste se re\u0161ili toga, posvetite se nekim rutinskim poslovima koji zamaraju telo, a odmaraju duh. Ne bi bilo lo\u0161e da se odlu\u010dite za spremanje doma ili oku\u0107nice. Uve\u010de na\u0111ite vremena za prijatelje i \u010dlanove porodice."
      },
      {
         "name_sign":"Vaga",
         "txt_hrs":"Nesporazumi u komunikaciji mogli bi da vas nepotrebno zavade sa dragim ljudima. Tako\u0111e, ne dozvolite sebi da se danas konfrontirate sa nadre\u0111enima u poslovnom okru\u017eenju. Najbolje bi bilo da se danas dr\u017eite po strani kada su razgovori u pitanju i da nikako ne iznosite va\u0161e mi\u0161ljenje. Postoji opasnost da budete pogre\u0161no shva\u0107eni."
      },
      {
         "name_sign":"\u0160korpija",
         "txt_hrs":"Nov\u010dani dugovi sa po\u010detka nedelje danas dolaze na naplatu. Ovo u vama izaziva nervozu i prave male napade panike, ali najbitnije je da se saberete i smireno razmotrite novonastalu situaciju. Obratite se svima u koje imate poverenja za savet ili \u010dak pozajmicu. Neka vam ovo bude nauk da u budu\u0107e pa\u017eljivije planirate tro\u0161kove."
      },
      {
         "name_sign":"Strelac",
         "txt_hrs":"Neke sre\u0107ne okolnosti u \u017eivotu jednog va\u0161eg bliskog prijatelja u\u010dini\u0107e da se i vi osetite sre\u0107nim i ponosnim. Ovoj situaciji je prethodilo mnogo truda i napornog rada. Svakako se potrudite da to zajedno proslavite. Na poslovnom planu zadr\u017eite optimizam, a svakako i veru u vlastite sposobnosti. Uspeh ni u va\u0161em slu\u010daju ne\u0107e izostati."
      },
      {
         "name_sign":"Jarac",
         "txt_hrs":"Ovaj dan donosi preokret na polju karijere. Ve\u0107 dugo ste nazadovoljni aktuelnom situacijom i svesni ste da je do\u0161lo vreme za nove po\u010detke. Mogu\u0107e je da \u0107ete u potpunosti promeniti profesiju. Ona najverovatnije uklju\u010duje kori\u0161\u0107enje novih tehnologija. Potrudite se da na vreme proverite da li posedujete odgovaraju\u0107e ve\u0161tine i kvalifikacije za takvu vrstu posla."
      }
   ]
}
PHP代码:

<?php
include('../lib/horoskopiusphpsdk.php');
$horoskopius = new HoroskopiusSDK();
$horoskopius->setPrivateKey("i1pOy/g5wF2BmMTKVxHXsSQO1V0=");
$horoskopius->setPublicKey("NjFlMjNkNzJjNmY0NDE1MDBkNDU3NmRlZDdjOWMxOTI0YjhlYjE0OQ==");
$horoskopius->setHoroscope(1);
$horoskopius->setCategory(1);
$horoskopius->setHoroscopeType(1);
$horoskopius->setResponseType("json");
$horoskopius->setAlphabet(1); //nova funkcija 1 = latinica, 2 = ćirilica
$horoskopius->getResponse();
?>

PHP库类

<?php
if (!function_exists('curl_init')) {
  throw new HoroskopiusAPIException('Horoskopius SDK zahteva CURL PHP ekstenziju.');
}
if (!function_exists('json_decode')) {
  throw new HoroskopiusAPIException('Horoskopius SDK zahteva JSON PHP ekstenziju.');
}
define('HOR_PATH_BASE', dirname(__FILE__) );
define( 'DRS', DIRECTORY_SEPARATOR );


class HoroskopiusAPIException extends Exception
{
    public function __construct($message, $code = 0, Exception $previous = null) {
        parent::__construct($message, $code, $previous);
    }
    public function __toString() {
        return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
    }
}


class HoroskopiusSDK {

    private $public_key;
    private $private_key;
    private $horoscope;
    private $horoscope_type;
    private $category;
    private $cache;
    private $response_type;
    private $signature;
    /* Headlines */
    private $headline_horoscope;
    private $headline_category;
    private $headline_type;
    private $date_horoskop;
    private $speedup;
    private $latin;

    public function __construct() {
             $this->response_type = 'xml';
             $this->horoscope = 1;
             $this->category = 1;
             $this->horoscope_type = 1;
             $this->cache = 1;
             $this->speedup = 1;
             $this->latin = 1;
    }

    public function setAlphabet($i) {
            $this->latin = ($i > 0 && $i <= 2) ? $i : $this->latin;
    }

    private function generateSignature($k) {
        $sig = base64_encode(hash_hmac('sha1', $k, true));  
        return $sig;
    }

    public function setResponseType($s) {
            if ($s == NULL) : 
            $this->response_type = 'xml';
            else: 
            $this->response_type = $s;
            endif;
    }

    public function setHoroscope($i) {
            $this->horoscope = ($i > 0 && $i <= 2) ? $i : $this->horoscope;
            if ($this->horoscope == 1) : 
            $this->headline_horoscope = 'Horoskop';
            else : 
            $this->headline_horoscope = 'Kineski horoskop';
            endif;
    }

    public function setCache($i) {
            $this->cache = ($i > 0 && $i <= 2) ? $i : $this->cache;
    }

    public function setSpeedUp($i) {
            $this->speedup = ($i > 0 && $i <= 2) ? $i : $this->speedup;
    }

    public function setCategory($i) {
            $this->category = ($i > 0 && $i <= 3) ? $i : $this->category;
            if ($this->category == 1 && $this->horoscope == 1) : 
            $this->headline_category = '';
            elseif($this->category == 2 && $this->horoscope == 1) : 
            $this->headline_category = 'Ljubavni ';
            elseif($this->category == 3 && $this->horoscope == 1) :
            $this->headline_category = 'Poslovni ';
            else : 
            $this->headline_category = null;
            endif;
    }

    public function setHoroscopeType($i) {
            $this->horoscope_type = ($i > 0 && $i <= 3) ? $i : $this->horoscope_type;
            if ($this->horoscope_type == 1) : 
            $this->headline_type = 'Dnevni ';
            elseif($this->horoscope_type == 2) : 
            $this->headline_type = 'Nedeljni ';
            elseif($this->horoscope_type == 3) :
            $this->headline_type = 'Mesečni ';
            else : 
            $this->headline_type = null;
            endif;
    }

    public function setPrivateKey($k) {
            $this->private_key = $k;
    }

    public function setPublicKey($k) {
            $this->public_key = $k; 
    }

    public function getResponse() {
        switch ($this->response_type) :
            case 'xml':
                $this->returnXML();
            break;

            case 'json':
                /*$this->returnJSON();*/
                $this->encodeJSON();
            break;
        endswitch;
    }

    private function setCurlResponse() {    
        $this->signature = $this->generateSignature($this->private_key);
        $url = "http://dev.horoskopius.com/service/";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch, CURLOPT_POSTFIELDS, "type=$this->response_type&horoscope=$this->horoscope&category=$this->category&horoscope_type=$this->horoscope_type&sig=" . urlencode($this->signature) . "&auth=" . urlencode($this->public_key) . "&cache=" . $this->cache .""); 
        curl_setopt($ch, CURLOPT_USERAGENT, 'Horoskopius');
        $result = curl_exec($ch);
        return $result;
    }

    private function returnXML() {
        $cachefile = HOR_PATH_BASE . DRS . 'cachebase' . DRS . $this->response_type . $this->category . $this->horoscope . $this->horoscope_type . '.htm';
        $cachetime = 180*60;
        if (file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile)) && $this->speedup == 1) :
        require($cachefile);
        echo '<!-- speed up horoskopius -->';
        else:
        $response = $this->setCurlResponse();
        $xml = new SimpleXmlElement($response, LIBXML_NOCDATA);
        $cnt = count($xml->{"horoscope"});
        $content = '<div id="horoskopius">'.
             '<h2>' . $this->latin2cyrillic($this->headline_type . $this->headline_category . $this->headline_horoscope) . '</h2>'.
             '<span class="horoskopius-date"></span><ul>';
        for($i=0; $i<$cnt; $i++) :
            $content.= '<li><span class="sign-container hor-' . strtolower(str_replace("Š", "s", $xml->{"horoscope"}[$i]->{"sign"})) . '"></span><h3>' . $this->latin2cyrillic($xml->{"horoscope"}[$i]->{"sign"}) . '</h3> ' . $this->latin2cyrillic($xml->{"horoscope"}[$i]->{"horoscopetxt"}) . '</li>';
        endfor;
            $content .= '<li class="horoskopius-link">' . $this->latin2cyrillic('Horoskop obezbedio - Astro portal').' <a href="http://www.horoskopius.com">Horoskopius</a></li>';
            $content .= '</ul></div>';
            echo $content;
        $fp = fopen($cachefile, 'w');
        fwrite($fp, $content);
        fclose($fp);
        endif;
    }
    private function encodeJSON() { 
        $cachefile = HOR_PATH_BASE . DRS . 'cachebase' . DRS . $this->response_type . $this->category . $this->horoscope . $this->horoscope_type . '.htm';
        $cachetime = 180*60;

        if (file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile)) && $this->speedup == 1) {

            // get data from cache
            $response = file_get_contents($cachefile);

            // output data
            echo $response;
        } else {

            // collect new data
            $response = $this->setCurlResponse();

            // cache data
            $fp = fopen($cachefile, 'w');
            fwrite($fp, $response);
            fclose($fp);

            // output data
            echo $response;
        }
    }

    private function returnJSON() {

        $cachefile = HOR_PATH_BASE . DRS . 'cachebase' . DRS . $this->response_type . $this->category . $this->horoscope . $this->horoscope_type . '.htm';
        $cachetime = 180*60;
        if (file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile)) && $this->speedup == 1) :
        require($cachefile);
        echo '<!-- speed up horoskopius -->';
        else:
        $response = $this->setCurlResponse();
        $json = json_decode($response);
        $content = '<div id="horoskopius">'.
             '<h2>' . $this->latin2cyrillic($this->headline_type . $this->headline_category . $this->headline_horoscope) . '</h2>'.
             '<span class="horoskopius-date"></span><ul>';
            $cnt = count($json->{"horoscope"});
            for($i=0; $i<$cnt; $i++) :
            $content .= '<li><span class="sign-container hor-' . strtolower(str_replace("Š", "s", $json->{"horoscope"}[$i]->{"name_sign"})) . '"></span><h3>' . $this->latin2cyrillic($json->{"horoscope"}[$i]->{"name_sign"}) . '</h3> ' . $this->latin2cyrillic($json->{"horoscope"}[$i]->{"txt_hrs"}) . '</li>';
            endfor;
            $content .= '<li class="horoskopius-link"> ' . $this->latin2cyrillic('Horoskop obezbedio - Astro portal') . ' <a href="http://www.horoskopius.com">Horoskopius</a></li>';
            $content .= '</ul></div>';
            echo $content;
        $fp = fopen($cachefile, 'w');
        fwrite($fp, $content);
        fclose($fp);
        endif;
    }


    private function latin2cyrillic($text) {

        $tr = array(
                    "A"=>"А",
                    "B"=>"Б",
                    "C"=>"Ц",
                    "Č"=>"Ч",
                    "D"=>"Д",
                    "Đ"=>"Ђ",
                    "E"=>"Е",
                    "F"=>"Ф",
                    "G"=>"Г",
                    "H"=>"Х",
                    "I"=>"И", 
                    "J"=>"Ј",
                    "K"=>"К",
                    "L"=>"Л",
                    "M"=>"М",
                    "N"=>"Н", 
                    "O"=>"О",
                    "P"=>"П",
                    "R"=>"Р",
                    "S"=>"С",
                    "Š"=>"Ш", 
                    "T"=>"Т",
                    "U"=>"У",
                    "V"=>"В",
                    "Z"=>"З",
                    "Ž"=>"Ж", 
                    "Ć"=>"Ћ",
                    "a"=>"а",
                    "b"=>"б",
                    "c"=>"ц",
                    "č"=>"ч", 
                    "ć"=>"ћ",
                    "d"=>"д",
                    "đ"=>"ђ",
                    "e"=>"е",
                    "f"=>"ф",
                    "g"=>"г", 
                    "h"=>"х",
                    "i"=>"и",
                    "j"=>"ј",
                    "k"=>"к",
                    "l"=>"л", 
                    "m"=>"м",
                    "n"=>"н",
                    "o"=>"о",
                    "p"=>"п",
                    "r"=>"р", 
                    "s"=>"с",
                    "š"=>"ш",
                    "t"=>"т",
                    "u"=>"у",
                    "v"=>"в", 
                    "z"=>"з",
                    "ž"=>"ж",
                    "Lj"=>"Љ",
                    "Nj"=>"Њ",
                    "Dž"=>"Џ",
                    "lj"=>"љ",
                    "nj"=>"њ",
                    "dž"=>"џ"
                    );
    if ($this->latin == 2) : 
    return strtr($text,$tr);    
    else : 
    return $text;
    endif;
    }

}?>

这可能是json输出中字节顺序标记的问题。我不熟悉android,但请确保应用程序以正确的方式处理json BOM(如空格)。如果是这样,请检查php文件的utf8编码是否正确。在我用于php的编辑器中,我将文件保存为utf8编码,没有BOM。

问题在于php代码前后的空行