将数组转换为UTF-8?PHP JSON

6

我有一些由PHP从数据库生成的多维数组,但是其中包含“č ć š đ ž”等字符,当我尝试在JSON中输出时,它只返回null。我阅读了一些相关资料,发现JSON仅支持UTF-8编码。那么我该如何将这些数组转换为UTF-8编码?但是最终我仍需要这些数组。

以下是我的脚本代码:

     $sql_main = mysql_connect(DB_HOST, DB_UNM, DB_PSW);
    ($sql_main)? mysql_select_db(DB_NM) : mysql_error();

    $APP_URL_ACCESS = $_GET['app_access_key'];

    $sql_app = mysql_query("SELECT * FROM app_sys WHERE APP_OW_C='$APP_URL_ACCESS'") or die(mysql_error());

    if(mysql_num_rows($sql_app)==1){

        while($row = mysql_fetch_array($sql_app)){
        $APP_UA_ID          = $row['APP_UA_ID'];
        $APP_NM             = $row['APP_NM'];
        $APP_H_DMN          = $row['APP_H_DMN'];
        $APP_H              = $row['APP_H'];
        $APP_H_DB_UNM       = $row['APP_H_DB_UNM'];
        $APP_DB_NM          = $row['APP_DB_NM'];
        $APP_H_DB_PSW       = $row['APP_H_DB_PSW'];
        $APP_H_DB_SRV       = $row['APP_H_DB_SRV'];
        $APP_ACTIVE         = $row['APP_ACTIVE'];
        $APP_OW_C           = $row['APP_OW_C'];


    }
    $ROW_APP[] = array(
                        'APP_UA_ID' => $APP_UA_ID,
                        'APP_PERMISSION' => $APP_ACTIVE,
                        'APP_KEY' => $APP_OW_C);
    $APP_ARRAY[''] = $ROW_APP;



    ($APP_ACTIVE == '1')? $sql_connect_app = mysql_connect($APP_H_DB_SRV, $APP_H_DB_UNM, $APP_H_DB_PSW) && mysql_select_db($APP_DB_NM): $_MSG = "Application Is Not Active"; 

    $sql_news = mysql_query("SELECT * FROM news  ORDER BY id DESC LIMIT 10") or die(mysql_error());
    while($row = mysql_fetch_array($sql_news, MYSQL_ASSOC)){
            //$display_json['data'] = array(
                //'id' => $row['id'],
    //          'title' => $row['title'],
        //      'story' => $row['story'],
        //      'img' => $row['img'],
            //  'author' => $row['author'],
                //'datetime' => $row['datetime'],
                //'shorten_story' => substr($row['story'], 0, 150) . '...'); */

            $ROW_APP_DATA[] = $row; 
    //

}

$sql_news = mysql_query("SELECT * FROM actual  ORDER BY id DESC LIMIT 10") or die(mysql_error());
while($row = mysql_fetch_array($sql_news, MYSQL_ASSOC)){
        /*$display_json['data'] = array(
            'id' => $row['id'],
            'title' => $row['title'],
            'story' => $row['story'],
            'img' => $row['img'],
            'author' => $row['author'],
            'datetime' => $row['datetime'],
            'shorten_story' => substr($row['story'], 0, 150) . '...'); */
            $ROW_APP_THIRDPART[] = $row;    
    //

}

$JSON_ARRAY_APP['application'] = $ROW_APP;
$JSON_ARRAY_DATA_1['news'] = $ROW_APP_DATA;
$JSON_ARRAY_DATA_2['actual'] = $ROW_APP_THIRDPART;
$JSON_ARRAY_DATA['data'] = array_merge($JSON_ARRAY_DATA_1, $JSON_ARRAY_DATA_2);
$JSON_OUTPUT = array_merge($JSON_ARRAY_APP, $JSON_ARRAY_DATA);
echo json_encode($JSON_OUTPUT);

}else{
exit(); 
}

数据库设置为cp1520_croatian_ci,对于这些字符来说非常好。 - Silvio Marijic
7个回答

12

我发现iconv是将字符集转换为UTF-8的最佳方法。您可以利用PHP的array_walk_recursive来处理多维数组:

$array = array(); // This is your multidimensional array

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

你可以将windows-1252更改为你要转换的字符集。

1
@safoo 没问题。只需记住 utf8_encode 期望您的字符串为 ISO-8859-1 编码。如果您给它一个具有不同编码的字符串,您将遇到奇怪的错误。 - WildlyInaccurate

7

尝试使用这个函数:

function utf8_converter($array)
{
    array_walk_recursive($array, function(&$item, $key){
        if(!mb_detect_encoding($item, 'utf-8', true)){
            $item = utf8_encode($item);
        }
    });

    return $array;
}

1
如果是多维数组,则使用foreach循环,并在循环内使用此行代码。例如:
foreach ($your_array as $line){
   $line = array_map("utf8_decode", $line);    
}

0

尝试使用这个PHP函数,它可以简单地传入你希望编码的数组。

function convertArrayKeysToUtf8(array $array) { 
$convertedArray = array(); 
foreach($array as $key => $value) { 
  if(!mb_check_encoding($key, 'UTF-8')) $key = utf8_encode($key); 
  if(is_array($value)) $value = $this->convertArrayKeysToUtf8($value); 

  $convertedArray[$key] = $value; 
} 
return $convertedArray; 
  } 

顺便提一下,可以查看php.net获取其他UTF-8编码方法的想法,但这在过去对我有效。


0
$row = utf8_encode( $row );
convertUtf8ToHtml( $row );
$ROW_APP_DATA[] = $row;

See function below:


// converts a UTF8-string into HTML entities
    //  - $utf8:        the UTF8-string to convert
    //  - $encodeTags:  booloean. TRUE will convert '<' to '&lt;'
    //  - return:       returns the converted HTML-string
    function convertUtf8ToHtml(&$utf8, $encodeTags = false ) 
    {
        if( !is_string( $utf8 ) || empty( $utf8 ))
         { return false; }
        $result = '';
        for ($i = 0; $i < strlen($utf8); $i++) {
            $char = $utf8[$i];
            $ascii = ord($char);
            if ($ascii < 128) {
                // one-byte character
                $result .= ($encodeTags) ? htmlentities($char) : $char;
            } else if ($ascii < 192) {
                // non-utf8 character || not a start byte
            } else if ($ascii < 224) {
                // two-byte character
                $result .= htmlentities(substr($utf8, $i, 2), ENT_QUOTES, 'UTF-8');
                $i++;
            } else if ($ascii < 240) {
                // three-byte character
                $ascii1 = ord($utf8[$i+1]);
                $ascii2 = ord($utf8[$i+2]);
                $unicode = (15 & $ascii) * 4096 +
                           (63 & $ascii1) * 64 +
                           (63 & $ascii2);
                $result .= '&#$unicode;';
                $i += 2;
            } else if ($ascii < 248) {
                // four-byte character
                $ascii1 = ord($utf8[$i+1]);
                $ascii2 = ord($utf8[$i+2]);
                $ascii3 = ord($utf8[$i+3]);
                $unicode = (15 & $ascii) * 262144 +
                           (63 & $ascii1) * 4096 +
                           (63 & $ascii2) * 64 +
                           (63 & $ascii3);
                $result .= '&#$unicode;';
                $i += 3;
            }
        }

        $utf8 = $result;
        return true;
    }

0

我也遇到了这个问题,在2016年你不需要创建一个函数,只需使用'mb_convert_variables'

mb_convert_variables('UTF-8', '原始编码', 数组或对象)

对于任何遇到这种情况的人。


-1

我不使用函数,而是在每个赋值中使用转换:

$APP_UA_ID = utf8_encode($row['APP_UA_ID']);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接