ugrás a tartalomhoz

JSON_UNESCAPED_UNICODE

Tanul0 · 2012. Feb. 17. (P), 10.09
Üdv!

Mivel php 5.2-t használunk, ezért json_encode($array, UNESCAPED_UNICODE) sajnos nem elérhető.

A problémám az ékezetes karakterekkel van. Találtam néhány függvényt erre, ami eddig a leghasználhatóbbnak tünt az ez:

function json_encode_string($in_str)
  {
    mb_internal_encoding("UTF-8");
    $convmap = array(0x80, 0xFFFF, 0, 0xFFFF);
    $str = "";
    for($i=mb_strlen($in_str)-1; $i>=0; $i--)
    {
      $mb_char = mb_substr($in_str, $i, 1);
      if(mb_ereg("&#(\\d+);", mb_encode_numericentity($mb_char, $convmap, "UTF-8"), $match))
      {
        $str = sprintf("\\u%04x", $match[1]) . $str;
      }
      else
      {
        $str = $mb_char . $str;
      }
    }
    return $str;
  }
  function php_json_encode($arr)
  {
    $json_str = "";
    if(is_array($arr))
    {
      $pure_array = true;
      $array_length = count($arr);
      for($i=0;$i<$array_length;$i++)
      {
        if(! isset($arr[$i]))
        {
          $pure_array = false;
          break;
        }
      }
      if($pure_array)
      {
        $json_str ="[";
        $temp = array();
        for($i=0;$i<$array_length;$i++)       
        {
          $temp[] = sprintf("%s", php_json_encode($arr[$i]));
        }
        $json_str .= implode(",",$temp);
        $json_str .="]";
      }
      else
      {
        $json_str ="{";
        $temp = array();
        foreach($arr as $key => $value)
        {
          $temp[] = sprintf("\"%s\":%s", $key, php_json_encode($value));
        }
        $json_str .= implode(",",$temp);
        $json_str .="}";
      }
    }
    else
    {
      if(is_string($arr))
      {
        $json_str = "\"". json_encode_string($arr) . "\"";
      }
      else if(is_numeric($arr))
      {
        $json_str = $arr;
      }
      else
      {
        $json_str = "\"". json_encode_string($arr) . "\"";
      }
    }
    return $json_str;
  }
Nos ez működött is egy ideig, amíg nem használtam többdimenzós tömböt. Próbáltam hackelni, de egyszerűen nem jövök rá, hogy miért nem megy több dimenziós tömb esetén.

Tud valaki esetleg valami jobb megoldást ennél?

Köszi a segítséget előre is!
 
1

Jav: json_encode($array,

Tanul0 · 2012. Feb. 17. (P), 10.10
Jav: json_encode($array, JSON_UNESCAPED_UNICODE)
:)
2

egyszerűen nem jövök rá, hogy

Hidvégi Gábor · 2012. Feb. 17. (P), 10.15
egyszerűen nem jövök rá, hogy miért nem megy több dimenziós tömb esetén
Próbáld meg az Egyszerű hibakeresésben leírtaknak megfelelően kiíratni a változókat, debugolni a scriptet, hogy megértsd a működését.
3

Tegnap 2-3 órát minimum

Tanul0 · 2012. Feb. 17. (P), 10.18
Tegnap 2-3 órát minimum szórakoztam a dologgal. Gondoltam több szem többet lát :)
5

Annyira nem hosszú ez a kód.

Hidvégi Gábor · 2012. Feb. 17. (P), 12.38
Annyira nem hosszú ez a kód.
4

drupal_json_encode_helper

Poetro · 2012. Feb. 17. (P), 11.51
Tálán a drupal_json_encode_helper forrása segít.
6

base64

dragi · 2012. Feb. 17. (P), 20.47
Próbáld meg elkódólni base64-el. A túloldalon meg vissza. Elvégre a JSON is csak egy string.
7

JavaScript

Poetro · 2012. Feb. 17. (P), 20.52
Gondolom JavaScript-ben szeretné felhasználni a JSON-t, illetve valami külső alkalmazás számára elérhetővé tenni. Ekkor pedig nem igazán segít a base64, mert rengeteg plusz terhet ró a fogyasztóra.
8

Valamit valamiért. Egyébként

dragi · 2012. Feb. 17. (P), 20.59
Valamit valamiért. Egyébként javascriptre is van base64 decode-encode.
9

Felesleges

Poetro · 2012. Feb. 17. (P), 21.01
Van, de teljesen felesleges ezzel terhelni a felhasználó gépét, ráadásul rengeteg függvénytárral nem működik így flottul együtt. A kódolást meg lehet szépen oldani, ahogy már korábban is írtam.
10

Doksi

T.G · 2012. Feb. 18. (Szo), 10.55
A PHP doksinak nagyon hasznos része a kommentek!
http://hu.php.net/manual/en/function.json-encode.php#107369

<?php
$a = array(
	'Szevasz' => 'Világ!'
);
$callback = create_function('$matches', 'return "&#".hexdec($matches[1]).";";');
echo preg_replace_callback('/\\\u(\w\w\w\w)/', $callback, json_encode($a));
11

Megmondom őszintén, hogy ezt

Tanul0 · 2012. Feb. 18. (Szo), 13.22
Megmondom őszintén, hogy ezt nem láttam valószínüleg átsiklottam felette, kicsit átalakítva most már tökéletes :) Köszönöm :)


$a = array(  
	'Szevász' => 'Világ!',
	'ííííöööüüüóóóőőőúúúűűűáááééé' => 'áááűűűúúúóóóöööüüüéééííí',
	'<á%681é-_<{}-' => array(
			        'Szevász' => 'Világ!',
				'ííííöööüüüóóóőőőúúúűűűáááééé' => 'áááűűűúúúóóóöööüüüéééííí'
			)
);  

$callback = create_function('$matches', 'return utf8_encode(html_entity_decode("&#".hexdec($matches[1]).";"));');  
preg_replace_callback('/\\\u(\w\w\w\w)/', $callback, json_encode($a)));

A kimenet így már tökéletes:

{"Szevász":"Világ!","ííííöööüüüóóóőőőúúúűűűáááééé":"áááűűűúúúóóóöööüüüéééííí","<á%681é-_<{}-":{"Szevász":"Világ!","ííííöööüüüóóóőőőúúúűűűáááééé":"áááűűűúúúóóóöööüüüéééííí"}}