0

这是我的代码:

<?php

error_reporting(E_ALL);
ini_set("display_errors", 1);

$form_num = $_GET['num'];

echo '<form name="creative" action = "'.htmlentities($_SERVER['PHP_SELF']).'?num='.$form_num.'" method="POST" >';

echo '<table>';

for ( $i=0; $i < $form_num ; $i++ ) {

    echo "<tr><td>Title: </td><td><input type='text' name='title$i' /></td></tr>";
    echo "<tr><td>Description: </td><td><input type='text' name='desc$i' /></td></tr>";


    echo "<tr><td>&nbsp;</td></tr>";
}

echo "<tr><td><input type='submit' name='submit' value='Update' /></td>
        <td><input type='reset' value='Reset' /></td></tr>";

echo '</table>';

echo '</form>';

if (isset($_REQUEST['submit'])) {

    require 'ad.php';

    $ad = new adnetwork( $hostname, $user, $password, $database );

    echo 'Status is active and set notifications are : <br /><br />';

    for ($i=0; $i< $form_num; $i++) {

        $params[] = array(
            'title' => $ad->utf8_to_unicode(html_entity_decode($_REQUEST["title$i"], ENT_COMPAT, "UTF-8")),
            'description' => $ad->utf8_to_unicode(html_entity_decode($_REQUEST["desc$i"], ENT_COMPAT, "UTF-8")),    

    }

    file_put_contents( dirname(__FILE__) . '/' . 'get_text_in_test.json', json_encode( $params ) );     
}

?>

在这里,当我使用将输入数字代码解析为字符代码的函数提交表单时:

public function utf8_to_unicode( $str ) {

            $unicode = array();        
            $values = array();
            $lookingFor = 1;

            for ($i = 0; $i < strlen( $str ); $i++ ) {
                $thisValue = ord( $str[ $i ] );
                if ( $thisValue < ord('A') ) {
                // exclude 0-9
                    if ($thisValue >= ord('0') && $thisValue <= ord('9')) {
                    // number
                    $unicode[] = chr($thisValue);
                    }
                    else {
                        $unicode[] = ''.chr($thisValue);
                    }           
                } else {
                    if ( $thisValue < 128) 
                        $unicode[] = $str[ $i ];
                    else {
                        if ( count( $values ) == 0 ) $lookingFor = ( $thisValue < 224 ) ? 2 : 3;                
                            $values[] = $thisValue;                
                                if ( count( $values ) == $lookingFor ) {
                                    $number = ( $lookingFor == 3 ) ?
                                    ( ( $values[0] % 16 ) * 4096 ) + ( ( $values[1] % 64 ) * 64 ) + ( $values[2] % 64 ):
                                    ( ( $values[0] % 32 ) * 64 ) + ( $values[1] % 64 );

                                    $number = dechex($number);
                                    $unicode[] = (strlen($number)==3)?"\u0".$number:"\u".$number;
                                    $values = array();
                                    $lookingFor = 1;
                                } // if
                        } // if
                    }
            } // for

            return implode("",$unicode);

        }

当我传递这样的字符串时❤★♫Cute Pics它应该给我这些符号的字符代码,为了实现这一点,我首先解码我的输入字符,然后在函数中抛出解码的字符串,这给了我这样的结果:\u2764\u2605\u266b可爱的图片,但是当我是 json_encode 时,这个以数组为界的字符串是:

$params[] = array(
                'title' => $ad->utf8_to_unicode(html_entity_decode($_REQUEST["title$i"], ENT_COMPAT, "UTF-8")),
                'description' => $ad->utf8_to_unicode(html_entity_decode($_REQUEST["desc$i"], ENT_COMPAT, "UTF-8")),    

        }

echo json_encode($params);

它在我的 Android 手机无法解释的字符代码前添加了一个额外的斜杠。由于这些字符代码被斜线转义,但json再次放置了 android 手机无法读取的斜线。另外,我没有使用数据库,所以我将这些 json 放在一个 json 格式的文件中,然后我使用 php 函数file_get_content从 json 文件中获取所有数据,然后使用它。请帮我解决这个问题。

4

1 回答 1

1

我认为您要么对正在传递的字符串进行双重解码。

运行此代码:

for ($i=0; $i< 2; $i++) {
    $params[] = array(
        'title' => "❤★♫Cute Pics",
        'description' => "This is some description",
    );
}

echo json_encode($params);

输出:

[{"title":"\u2764\u2605\u266bCute Pics","description":"This is some description"},{"title":"\u2764\u2605\u266bCute Pics","description":"This is some description"}]

哪个是有效的 JSON,应该在手机上很好地解释(除非它不支持 UTF8)。

我认为你应该只删除调用,html_entity_decode除非你确定你正在接收编码字符串(你几乎可以肯定不是因为网络服务器为你解码它们),并且还删除 utf8_to_unicode 因为json_encode直接从 UTF8 到正确编码的 JSON - 你不必自己做。

然后它显示带有单斜杠的json,但不适用于移动设备

那么这将是移动设备如何解码 JSON 的问题,您需要在那里解决这个问题。

于 2013-02-25T14:41:31.157 回答