কেন json_encode একটি খালি স্ট্রিং ফিরে আসবে


107

3 টি নেস্টেড অ্যারে সহ আমার একটি সাধারণ পিএইচপি গঠন রয়েছে।

আমি নির্দিষ্ট অবজেক্ট ব্যবহার করি না এবং আমি 2 নেস্টেড লুপের সাহায্যে নিজেকে অ্যারে তৈরি করি।

আমি জসসনে রূপান্তর করতে চাইছি অ্যারের var_dump এর একটি নমুনা এখানে।

array (size=2)
  'tram B' => 
    array (size=2)
      0 => 
        array (size=3)
          'name' => string 'Ile Verte' (length=9)
          'distance' => int 298
          'stationID' => int 762
      1 => 
        array (size=3)
          'name' => string 'La Tronche Hôpital' (length=18)
          'distance' => int 425
          'stationID' => int 771
  16 => 
    array (size=4)
      0 => 
        array (size=3)
          'name' => string 'Bastille' (length=8)
          'distance' => int 531
          'stationID' => int 397
      1 => 
        array (size=3)
          'name' => string 'Xavier Jouvin' (length=13)
          'distance' => int 589
          'stationID' => int 438

অন্য স্ক্রিপ্টে আমার অনুরূপ কাঠামো আছে এবং json_encodeসূক্ষ্মভাবে কাজ করে। সুতরাং আমি বুঝতে পারি না কেন json_encodeএখানে কাজ করবে না।

সম্পাদনা: এনকোডিংয়ের সাথে কোনও সমস্যা আছে বলে মনে হচ্ছে। যখন mb_detect_encodingআয় হওয়া ASCII, json_encodeকাজ কিন্তু আপনার এটি UTF8 হওয়া ফেরৎ, এটা আর কাজ করে না।

Edit2: json_last_error()আয় JSON_ERROR_UTF8যার অর্থ: বিকৃত হল UTF-8 টি অক্ষর, সম্ভবত ভুল এনকোড


পিএইচপি ম্যানুয়ালটি বলে This function only works with UTF-8 encoded data.তাই এনকোডিংয়ে কোনও সমস্যা হওয়া উচিত নয়।
MahanGM

13
স্ট্রিংটি হাতে দেওয়ার আগে utf8_encode()আপনার nameঅ্যারে ক্ষেত্রগুলিতে ব্যবহার করার চেষ্টা করুন json_encode()
MahanGM

ধন্যবাদ ! আমি সবেমাত্র এই সমাধানে এসেছি যা আমার সমস্যার সমাধান করে।
ম্যাথিউ রিগলার

হ্যাঁ, উত্তরটি দেখেছি। শুভকামনা।
মহানজিএম

3
সমস্যাটি দেখতে JSON_PARTIAL_OUTPUT_ON_ERRORবিকল্পটি ব্যবহার করুন (উদাঃ UTF8 সহ ক্ষেত্রটি শূন্য হবে)।
পিটার ক্রাউস

উত্তর:


255

ওয়েল খননের 2 ঘন্টা পরে (সিএফ সম্পাদনা)

আমি নিম্নলিখিতটি খুঁজে পেয়েছি:

  • আমার ক্ষেত্রে এটি একটি এনকোডিং সমস্যা
  • mb_detect_encoding সম্ভবত একটি ত্রুটিযুক্ত প্রতিক্রিয়া ফিরিয়ে দেয়, কিছু স্ট্রিং সম্ভবত ইউটিএফ -8 ছিল না
  • utf8_encode()এই স্ট্রিংটি ব্যবহার করে আমার সমস্যার সমাধান হয়েছে তবে নীচের নোটটি দেখুন

এখানে একটি পুনরাবৃত্ত ফাংশন যা একটি অ্যারেতে থাকা সমস্ত স্ট্রিংগুলি ইউটিএফ -8 এ রূপান্তর করতে বাধ্য করতে পারে:

function utf8ize($d) {
    if (is_array($d)) {
        foreach ($d as $k => $v) {
            $d[$k] = utf8ize($v);
        }
    } else if (is_string ($d)) {
        return utf8_encode($d);
    }
    return $d;
}

এটি সহজভাবে এটি ব্যবহার করুন:

echo json_encode(utf8ize($data));

দ্রষ্টব্য: utf8_encode () ডকস অনুযায়ী ইউটিএফ -8 এ ISO-8859-1 স্ট্রিংটি এনকোড করেছে যাতে আপনি যদি ইনপুট এনকোডিং আইকনভি () বা mb_convert_encoding () সম্পর্কে নিশ্চিত না হন তবে মন্তব্য এবং অন্যান্য সমাধানগুলিতে উল্লিখিত হিসাবে আরও ভাল বিকল্প হতে পারে।


4
আপনার সমাধান ... যাইহোক, এক সাইড নোট জন্য ধন্যবাদ: পরিবর্তন } else {করতে } else if (is_string ($d)) {; অন্যথায় আপনি স্ট্রিংগুলিতে সমস্ত কিছু পরিবর্তন করবেন (উদাঃ INTএকটি হয়ে যাবে STRING)।
পল পিলেন

3
আপনি সবেমাত্র আমার জীবন বাঁচিয়েছেন। আমি এই ফাংশনটি না পাওয়া পর্যন্ত আমি সবকিছু শেষ করতে চলেছি! ধন্যবাদ.
silversunhunter

2
ডব্লিউটিএফ! আপনার সমাধান ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ। আমি দেখতে পাচ্ছি যে এটি বের করার জন্য প্রচুর খনন করতে হবে এবং আমি এটি করার জন্য এবং ভাগ করে নেওয়ার জন্য আপনাকে কৃতজ্ঞ।
ক্রিস

1
তিন দিনের ডিবাগিংয়ের পরে, আমি আপনাকে এখনই চুমুতে পারি।
এজেবি

2
ডাটাবেস থেকে পড়া মাত্র যদি ব্যবহার হয়, $ সংযোগ>> set_charset ("utf8");
অ্যান্ড্রু ব্রিগস

36

ম্যাথিউ রিগলার সত্যিই ভাল সমাধান উপস্থাপন করেছেন তবে জিনিসগুলি হ্যান্ডেল করার জন্য আমাকে কিছুটা পরিবর্তন করতে হয়েছিল:

function utf8ize($d) {
    if (is_array($d)) 
        foreach ($d as $k => $v) 
            $d[$k] = utf8ize($v);

     else if(is_object($d))
        foreach ($d as $k => $v) 
            $d->$k = utf8ize($v);

     else 
        return utf8_encode($d);

    return $d;
}

আরও একটি দ্রষ্টব্য: json_last_error () json_encode () / json_encode () ফাংশনগুলি ডিবাগ করতে সহায়ক হতে পারে।


এর elseifপরিবর্তে হওয়া উচিত নয় else if? (যেমন ফাঁকা নেই)।
উয়ে কেইম

2
@ উওকিম পিএইচপি ডকুমেন্টেশন অনুসারে "অন্যথায় এবং অন্যথায় যদি কোঁকড়া বন্ধনী ব্যবহার করার সময় কেবল একই হিসাবে বিবেচিত হবে" যার অর্থ আপনি যতক্ষণ না কোলন স্বরলিপি ব্যবহার না করেন ততক্ষণ তারা সমতুল্যif(): elseif:
অ্যাডাম বুবেলা

1
ভাল করেছ. পিএইচপি হ'ল আবর্জনা এবং আপনার মতো ছেলেরা এটিকে ডাম্প যেতে না দেয়।
লনি সেরা

else if(is_int($d)||is_bool($d)) return $d;আপনার শেষের আগে একটি সন্নিবেশ করা উচিত , কারণ:{"success":true, "message":"Ⲃⲟⲟ𝓵ⲉⲁⲛ ⲁⲛⲇ Ⲓⲛϯⲉ𝓰ⲉꞅ𝛓"}
ডেভিড রেফুয়া

@ Matthieu-riegler করার @ Paul-peelen সুপারিশ মত: পরিবর্তনের গত elseজন্য else if(is_string ($d)); অন্যথায় আপনি স্ট্রিংগুলিতে সমস্ত কিছু পরিবর্তন করবেন (উদাঃ INTএকটি হয়ে যাবে STRING)।
ব্রুনো সেরানানো

30

আমার জন্য, এই সমস্যার উত্তরটি charset=utf8আমার পিডিও সংযোগে সেট করা ছিল ।

$dbo = new PDO('mysql:host=localhost;dbname=yourdb;charset=utf8', $username, $password);

2
বা মাইসকিলি ফাংশনে: mysqli_set_charset ($ সংযোগ, "utf8");
ব্যবহারকারী18099

এটি আমার সমাধানের ইঙ্গিত ছিল। এমএসকিলি সংযোগের সামান্য ভিন্ন কারণ। $mysqli->set_charset("utf8");আপনার ডাটাবেস পরিচালনা করার পরে কেবল কল করুন ।
MaggusK

দয়া করে utf8mb4সাম্প্রতিক মাইএসকিউএল সংস্করণগুলিতে ব্যবহার করুন । utf8অপ্রচলিত।
ধর্মমান

10

অ্যাডাম বুবেলা সত্যিই ভাল সমাধানও উপস্থাপন করেছিলেন যিনি আমাকে আমার সমস্যা সমাধানে সহায়তা করেছিলেন এবং এখানে সরল কর্ম রয়েছে:

function utf8ize($d)
{ 
    if (is_array($d) || is_object($d))
        foreach ($d as &$v) $v = utf8ize($v);
    else
        return utf8_encode($d);

    return $d;
}

1
কীগুলি সংরক্ষণ করার সাথে সাথে আমি এটি পছন্দ করি।
dev0

7

আমার পিএইচপি 5.6 এ ঠিক একই সমস্যা আছে। আমি উইন্ডোজ on এ ওপেন সার্ভার + এনগিনেক্স ব্যবহার করি All সমস্ত চরসেটগুলি ইউটিএফ -8 এ সেট করা আছে। তাত্ত্বিকভাবে, সরকারী ডকুমেন্টেশন অনুযায়ী পতাকা

JSON_UNESCAPED_UNICODE

এটি সমাধান করা উচিত। দুর্ভাগ্যক্রমে এটি আমার মামলা নয়। আমি জানিনা কেন. উপরের সমস্ত স্নিপেটগুলি আমার সমস্যার সমাধান করে না, এইভাবে আমি আমার নিজের প্রয়োগটি পেয়েছি। আমি বিশ্বাস করি এটি কাউকে সাহায্য করতে পারে। কমপক্ষে, রাশিয়ান চিঠি পরীক্ষায় উত্তীর্ণ হয়।

function utf8ize($d) {
    if (is_array($d) || is_object($d)) {
        foreach ($d as &$v) $v = utf8ize($v);
    } else {
        $enc   = mb_detect_encoding($d);

        $value = iconv($enc, 'UTF-8', $d);
        return $value;
    }

    return $d;
}

4

এই গৃহীত উত্তর কাজ করে। তবে আপনি যদি মাইএসকিউএল থেকে আপনার ডেটা পাচ্ছেন (যেমনটি ছিলাম) তখন আরও সহজ উপায় আছে।

একবার আপনি আপনার ডাটাবেস খুলুন, আপনি জিজ্ঞাসা করার আগে আপনি mysqli ব্যবহার করে অক্ষর সেটটি নিম্নরূপে সেট করতে পারেন:

/* change character set to utf8 | Procedural*/
if (!mysqli_set_charset($link, "utf8")) {
    printf("Error loading character set utf8: %s\n", mysqli_error($link));
    exit();
}

অথবা

/* change character set to utf8 | Object Oriented*/
if (!$mysqli->set_charset("utf8")) {
        printf("Error loading character set utf8: %s\n", $mysqli->error);
        exit();
 }

লিঙ্ক: http://php.net/manual/en/mysqli.set-charset.php


4

আমি এই সমস্যাটি নিয়ে একটি সার্ভারে পিএইচপি (5.2) এর একটি পুরানো সংস্করণ চালাচ্ছি। আমি JSON_FORCE_OBJECT পতাকা ব্যবহার করছিলাম এবং দৃশ্যত এটি 5.3 পর্যন্ত সমর্থিত নয়

সুতরাং আপনি যদি সেই পতাকাটি ব্যবহার করেন তবে আপনার সংস্করণটি পরীক্ষা করে দেখুন!

একটি workaround এনকোডিংয়ের আগে কোনও বস্তুতে কেবল কাস্টিংয়ের মতো উপস্থিত হয়, যেমন:

json_encode((object)$myvar);

3

এর প্রত্যাবর্তন mb_detect_encodingসঠিক নাও হতে পারে:

$data = iconv('UTF-8', 'ISO-8859-1', 'La Tronche Hôpital');
var_dump(
    mb_detect_encoding($data),
    mb_detect_encoding($data, array('ISO-8859-1', 'UTF-8'))
);

ডিফল্ট সনাক্তকরণ আদেশের উপর নির্ভর করে উপরেরগুলি বিভিন্ন ফলাফল দিতে পারে, তাই এনকোডিংটি ভুলভাবে ইউটিএফ -8 হিসাবে রিপোর্ট করা হচ্ছে। ( এখানে একটি বৃহত্তর উদাহরণ ।)

এটি তাই সম্ভবত আপনার ডেটার হল UTF-8 যেমন এনকোড না হয়, json_encodeফিরে আসছে false। আপনার স্ট্রিংগুলি জেএসএন-এনকোডিংয়ের আগে ইউটিএফ -8 এ রূপান্তর করা উচিত:

$fromEncoding = 'ISO-8859-1'; // This depends on the data

array_walk_recursive($array, function (&$value, $key, $fromEncoding) {
    if (is_string($value)) {
        $value = iconv($fromEncoding, 'UTF-8', $value);
    }
}, $fromEncoding);

3

আমি ob_get_clean () থেকে ডেটা পাচ্ছিলাম এবং একই সমস্যা ছিল, তবে উপরের সমাধানগুলি আমার পক্ষে কাজ করে না। আমার ক্ষেত্রে সমাধানটি এটি ছিল, সম্ভবত এটি কারওর পক্ষে সহায়তা করবে।

$var = mb_convert_encoding($var, 'UTF-8');

2

এই স্ট্রিংয়ে utf8_encode () ব্যবহার করা আমার সমস্যার সমাধান করেছে।


1

আমি অ্যাডাম বুবেলার উত্তরটি উন্নত করেছি। Just এবং by দ্বারা ব্লকগুলি বন্ধ না হলে আমি কেবল এটি ঘৃণা করি} এটি ক্লিনার এবং আপনি বাগগুলি প্রবর্তন করেন না বা এটি সম্ভবত আমি অতীতে পার্ল ব্যবহার করেছি :)

<?php

class App_Updater_String_Util {    
    /**
     * Usage: App_Updater_String_Util::utf8_encode( $data );
     *
     * @param mixed $d
     * @return mixed
     * @see http://stackoverflow.com/questions/19361282/why-would-json-encode-returns-an-empty-string
     */
    public static function utf8_encode($d) {
        if (is_array($d)) {
            foreach ($d as $k => $v) {
                $d[$k] = self::utf8_encode($v);
            }
        } elseif (is_object($d)) {
            foreach ($d as $k => $v) {
                $d->$k = self::utf8_encode($v);
            }
        } elseif (is_scalar($d)) {
            $d = utf8_encode($d);
        }

        return $d;
    }
}

?>


0

এই সমস্যাটি কখনও কখনও আসে - আপনি শিরোনাম অ্যাক্সেস নিয়ন্ত্রণ পাস করছেন না।

আমার ক্ষেত্রে যদি আমাকে json_encode এর আগে কোনও প্রতিধ্বনি যুক্ত করা হয়। এটি ফলাফল দেখাচ্ছে অন্যথায় ফাঁকা পৃষ্ঠা আসছে।

আমি যোগ করলাম

header('Access-Control-Allow-Origin: *'); 

এবং আমার সমস্যা সমাধান হয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.