How to save a JSON as unescaped UTF-8 in PHP 5.3?

前端 未结 5 1435
失恋的感觉
失恋的感觉 2020-12-10 19:40

I created a JSON file:

$json = array(
    \"Sample\" =>array(
        \"context\" => $context,
        \"date\"    => $date
    )
);

$url= \"sample         


        
相关标签:
5条回答
  • 2020-12-10 19:49

    Header

    setlocale(LC_CTYPE, array('ru_RU.utf8', 'ru_RU.utf8'));
    setlocale(LC_ALL, array('ru_RU.utf8', 'ru_RU.utf8'));
    

    Body

    json_encode($post_all, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);
    
    0 讨论(0)
  • 2020-12-10 19:51

    Perfect Implemention

    • Compatible with \\ (escaped backslashes itself)
    • Compatible with JSON_HEX_* flags

     

    function raw_json_encode($input, $flags = 0) {
        $fails = implode('|', array_filter(array(
            '\\\\',
            $flags & JSON_HEX_TAG ? 'u003[CE]' : '',
            $flags & JSON_HEX_AMP ? 'u0026' : '',
            $flags & JSON_HEX_APOS ? 'u0027' : '',
            $flags & JSON_HEX_QUOT ? 'u0022' : '',
        )));
        $pattern = "/\\\\(?:(?:$fails)(*SKIP)(*FAIL)|u([0-9a-fA-F]{4}))/";
        $callback = function ($m) {
            return html_entity_decode("&#x$m[1];", ENT_QUOTES, 'UTF-8');
        };
        return preg_replace_callback($pattern, $callback, json_encode($input, $flags));
    }
    

    Example

    <?php
    $json = array(
        'Sample' => array(
            'specialchars' => '<x>& \' "</x>',
            'backslashes' => '\\u0020',
            'context' => 'جمهوری اسلامی ایران',
        )
    );
    
    echo raw_json_encode($json, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
    
    /* 
    {"Sample":{"specialchars":"\u003Cx\u003E\u0026 \u0027 \u0022\u003C\/x\u003E","backslashes":"\\u0020","context":"جمهوری اسلامی ایران"}}
    */
    
    0 讨论(0)
  • 2020-12-10 20:00

    If you can't use JSON_UNESCAPED_UNICODE, you could probably unescape the JSON yourself after it's been encoded:

    $json = array(
        'Sample' => array(
            'context' => 'جمهوری اسلامی ایران'
        )
    );
    
    $encoded = json_encode($json);
    var_dump($encoded); // context: "\u062c\u0645..."
    
    $unescaped = preg_replace_callback('/\\\\u(\w{4})/', function ($matches) {
        return html_entity_decode('&#x' . $matches[1] . ';', ENT_COMPAT, 'UTF-8');
    }, $encoded);
    
    var_dump($unescaped); // context is unescaped
    file_put_contents('sample.json', $unescaped);
    

    Here's an example in PHP5.3.

    However, this shouldn't be necessary, as any JSON parser should correctly parse the escaped Unicode characters and give you back your original string.

    EDIT: A better pattern to use might be /(?<!\\\\)\\\\u(\w{4})/, which avoids incorrectly unescaping a JSON sequence like "\\u1234". See an example.

    0 讨论(0)
  • 2020-12-10 20:00

    You can use the mbstring approach:

    Try like this:

    fwrite($myfile, mb_convert_encoding(json_encode($json), "UTF-8"));
    
    0 讨论(0)
  • 2020-12-10 20:09
    $options = json_encode($optn);
            $arr = explode("\u", $options);
            foreach($arr as $key => $arr1){
                if($arr1[0] == '0'){
                    $ascCode = substr($arr1, 0, 4);
                    $newCode = html_entity_decode('&#x' .$ascCode. ';', ENT_COMPAT, 'UTF-8');
                    $arr[$key] = str_replace($ascCode, $newCode, $arr[$key]);
                }
            }
            $options = implode('', $arr);
    
    0 讨论(0)
提交回复
热议问题