У меня есть многомерные массивы, созданные 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(); }
Я нашел iconv
лучшим методом преобразования набора символов в UTF-8. Вы можете использовать array_walk_recursive
PHP для работы с многомерными массивами:
$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
на любой набор символов, из которого вы конвертируете.
Попробуйте эту функцию:
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; }
если многомерный массив, то используйте цикл forearch и используйте эту строку внутри foreach.
forearch ($your_array as $line){ $line = array_map("utf8_decode", $line); }
который преобразует ваш массив в utf8 … Наслаждайтесь …..
Попробуйте эту функцию 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; }
Ps проверяет php.net на другие идеи метода кодирования utf-8, но это сработало для меня в прошлом.
$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 '<' // - 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; }
Я тоже встретил эту проблему, и в 2016 году вам не нужно создавать функцию, просто используйте « mb_convert_variables »,
mb_convert_variables('UTF-8', 'original encode', array or object)
Для тех, кто встречается с этой ситуацией.