Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема кодировки после json преобразований, Запись в фаил 
V
    Опции темы
TheDestroyer
Дата 9.9.2011, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: нет



Здравствуйте!

Пытаюсь записать в фаил массив в json формате.
Проблема в том, что в фаил русские буквы записываются в виде & #1055;& #1088;& #1103;... (пробелы вставил специально, т.к. форум конвертирует их в кириллицу).
При считывании файла и преобразования обратно в php массив эти символы воспринимаются не как utf8 буквы, а как отдельные.
Вот код:
Код

$fp = fopen("file.txt","r+");    
// считываем содержимое файла в строку
$content = fread($fp, filesize("file.txt"));
fclose($fp); // закрываем соединение с файлом
echo "<br/>text1 = $content<br/>";
$arr = json_decode($content, true);

// поиск элемента
$ar_s = array("comment"=>"йцукен","file"=>"ch.flv","poster"=>"ch.jpg");

$key = array_search($ar_s, $arr["playlist"]);
echo"<br/>key=$key";
var_dump($key);

echo "<br/>";
echo "<pre>";
print_r($arr);
echo"</pre>";

// удаление элемента
array_splice($arr["playlist"],$key,1);

echo "<br/>";
echo "<pre>";
print_r($arr);
echo"</pre>";
$text= json_encode($arr);

echo "<br/>text1 = $text<br/>";
$text = str_replace ("\\/", "/", $text);
$text = utf8RawUrlDecode($text);

echo "<br/>text2 = $text<br/>";

//$text = "тест";

// запишем в фаил
$fp = fopen("test.txt","w");  
fwrite($fp,$text);
fclose($fp); // закрываем соединение с файлом

function utf8RawUrlDecode ($source) {
     $decodedStr = "";
     $pos = 0;
     $len = strlen ($source);
     while ($pos < $len) {
         $charAt = substr ($source, $pos, 1);
         if ($charAt == '\\') {
             $pos++;
             $charAt = substr ($source, $pos, 1);
             if ($charAt == 'u') {
                 // we got a unicode character
                 $pos++;
                 $unicodeHexVal = substr ($source, $pos, 4);
                 $unicode = hexdec ($unicodeHexVal);
                 $entity = "&#". $unicode . ';';
                 $decodedStr .= utf8_encode ($entity);
                 $pos += 4;
             }
             else {
                 // we have an escaped ascii character
                 $hexVal = substr ($source, $pos, 2);
                 $decodedStr .= chr (hexdec ($hexVal));
                 $pos += 2;
             }
         } else {
             $decodedStr .= $charAt;
             $pos++;
         }
     }
     return $decodedStr;
 }

После конвертирования $text= json_encode($arr); все русские буквы кодируются, чтобы их раскодировать использую функцию  utf8RawUrlDecode.
У меня php 5.2, так что параметр не кодировать символы применить не могу.
При отображении в браузере все русские буквы выглядят нормально, но вот при записи в фаил они выглядят так & #1055;
Проблема не в просмотрщике файла (смотрю в notepad++ в режиме utf-8). Да и при считывании из файла считываются именно символы П (т.е. 6 символов), а не русские буквы. Вроде бы все правильно русский символ кодируется шестью, но это не дает потом нормально работать с прочитанным вновь файлом, да и отображаться должно нормально в режиме просмотра в utf-8.
Подскажите пожалуйста, как сделать так, чтобы в фаил записывались именно русские буквы?
PM MAIL   Вверх
MoLeX
Дата 10.9.2011, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



как вариант кодировать в base64


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
TheDestroyer
Дата 10.9.2011, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: нет



Проблему решил так, изменил функцию перекодировки перед записью в фаил:
Код

function utf8RawUrlDecode1 ($source) {
     $decodedStr = "";
     $pos = 0;
     $len = strlen ($source);
     while ($pos < $len) {
         $charAt = substr ($source, $pos, 1);
         if ($charAt == '\\') {
             $pos++;
             $charAt = substr ($source, $pos, 1);
             if ($charAt == 'u') {
                 // we got a unicode character
                 $pos++;
                 $unicodeHexVal = substr ($source, $pos, 4);
                 $out = pack('H*', $unicodeHexVal);
                 $out = mb_convert_encoding($out, 'UTF-8', 'UTF-16');
                 $decodedStr .= $out;
                 
                 $pos += 4;
             }
             else {
                 // we have an escaped ascii character
                 $hexVal = substr ($source, $pos, 2);
                 $decodedStr .= chr (hexdec ($hexVal));
                 $pos += 2;
             }
         } else {
             $decodedStr .= $charAt;
             $pos++;
         }
     }
     return $decodedStr;
 }

Хотя, до сих пор не понял, почему такие мучения надо испытывать, а не просто записывать в utf8.
Поясните кто знает, пожалуйста.
PM MAIL   Вверх
capitan
Дата 13.9.2011, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 9
Всего: 13



Давно пользуюсь такой функцией, чтобы не знать проблем с кириллицей:
Код

// Json в windows
    function array2json($arr) {
        $parts = array();
        $is_list = false;
        
        if (!is_array($arr)) return;
        if (count($arr)<1) return '{}';
        
        //Find out if the given array is a numerical array
        $keys = array_keys($arr);
        $max_length = count($arr);  
                 
        if(($keys[0] == 0) and !empty($keys[$max_length]) and ($keys[$max_length] == $max_length)) {//See if the first key is 0 and last key is length - 1
            $is_list = true;
            for($i=0; $i<count($keys); $i++) { //See if each key correspondes to its position
                if($i != $keys[$i]) { //A key fails at position check.
                    $is_list = false; //It is an associative array.
                    break;
                }
            }
        }

        foreach($arr as $key=>$value) {
            if(is_array($value)) { //Custom handling for arrays
                if($is_list) $parts[] = array2json($value); /* :RECURSION: */
                else $parts[] = '"' . $key . '":' . array2json($value); /* :RECURSION: */
            } else {
                $str = '';
                if(!$is_list) $str = '"' . $key . '":';

                //Custom handling for multiple data types
                if(is_numeric($value)) $str .= $value; //Numbers
                elseif($value === false) $str .= 'false'; //The booleans
                elseif($value === true) $str .= 'true';
                else $str .= '"' . addslashes($value) . '"'; //All other things
                // :TODO: Is there any more datatype we should be in the lookout for? (Object?)

                $parts[] = $str;
            }
        }
        $json = implode(',',$parts);

        if($is_list) return '[' . $json . ']';//Return numerical JSON
        return '{' . $json . '}';//Return associative JSON
    }  

PM MAIL WWW ICQ   Вверх
TheDestroyer
Дата 13.9.2011, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: нет



Спасибо, в общем ясно, что либо кодировать надо как я, либо использовать свои JSON функции.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.