Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: serialize/unserialize и UTF-8
Форумы портала PHP.SU » » Кодировки и все смежное » serialize/unserialize и UTF-8

Страниц (2): [1] 2 »
 

1. DlTA - 09 Ноября, 2011 - 12:14:24 - перейти к сообщению
столкнулся с "(нет слов чтоб выразить)"
серелизуем данные на win-1251
serialize(array(1,2,"Текст")) = a:3:{i:0;i:1;i:1;i:2;i:2;s:5:"Текст";}
вроде все правильно и корректно
теперь тоже самое на UTF-8
serialize(array(1,2,"Текст")) = a:3:{i:0;i:1;i:1;i:2;i:2;s:10:"Текст";}

a:3:{i:0;i:1;i:1;i:2;i:2;s:5:"Текст";} = win-1251
a:3:{i:0;i:1;i:1;i:2;i:2;s:10:"Текст";} =UTF-8
ну как вам?!
и соответственно с unserialize проблемы если не то число для текста
2. Мелкий - 09 Ноября, 2011 - 12:27:56 - перейти к сообщению
Таки всё правильно. UTF8 же.
3. Самогонщик - 09 Ноября, 2011 - 12:31:57 - перейти к сообщению
DlTA пишет:
и соответственно с unserialize проблемы если не то число для текста
А какие конкретно проблемы?
4. caballero - 09 Ноября, 2011 - 12:46:26 - перейти к сообщению
Цитата:
и соответственно с unserialize проблемы

нет там никаких проблем - неоднократно проверено
5. Самогонщик - 09 Ноября, 2011 - 12:49:03 - перейти к сообщению
caballero пишет:
нет там никаких проблем - неоднократно проверено
Если сериолизовать строку в файле утф-8, а десериализовать цп-1251 или наоборот что будет?

Спрашиваю из чистого любопытства. Может кто-нибудь провести тест?
6. caballero - 09 Ноября, 2011 - 12:59:17 - перейти к сообщению
Цитата:
Если сериолизовать строку в файле утф-8, а десериализовать цп-1251


то что ты сериализуешь то он и отдает, если ты по дороге код конечно не перекодируешь. Не очень понятно что значит сериализовать в одной кодировке а десериализовать в другой

PHP вообще хранит строчные данные в UTF16
7. Самогонщик - 09 Ноября, 2011 - 13:03:51 - перейти к сообщению
caballero пишет:
PHP вообще хранит строчные данные в UTF16
Можно ссылку на документацию?

Я сейчас подыму тестовое окружение и попробую сам понять что значит
caballero пишет:
Не очень понятно что значит сериализовать в одной кодировке а десериализовать в другой
8. Мелкий - 09 Ноября, 2011 - 13:13:21 - перейти к сообщению
caballero пишет:
PHP вообще хранит строчные данные в UTF16

PHP вообще хранит строки как байты. О чём число перед строкой и говорит: читать столько байт - это будет строка.
9. caballero - 09 Ноября, 2011 - 13:14:04 - перейти к сообщению
Цитата:
Можно ссылку на документацию

документацию чего? Это внутренний формат - общеприняттый для сишных програм.

Цитата:
PHP вообще хранит строки как байты

все программы хранят все данные в байтах

Цитата:
О чём число перед строкой и говорит

в си нет числа перед строкой. И строк тоже нет
10. DlTA - 09 Ноября, 2011 - 13:24:38 - перейти к сообщению
Самогонщик пишет:
Если сериолизовать строку в файле утф-8, а десериализовать цп-1251 или наоборот что будет?
фигня получится
1) код символов не совпадет
2) в топе темы
(Добавление)
но если с первым можно было бы легко справиться пережав одну большую строку
то вот для того чтоб обойти вторую проблему надо лепить костыль

(переносить все сайты на utf-8 не предлагайте, сам умный.)
11. Мелкий - 09 Ноября, 2011 - 13:29:02 - перейти к сообщению
caballero пишет:
в си нет числа перед строкой. И строк тоже нет

Я про сериализованный вид. А вы про что?
(Добавление)
DlTA пишет:
2) в топе темы

В чём там фигня-то? Поведение полностью адекватное.
12. Самогонщик - 09 Ноября, 2011 - 13:36:12 - перейти к сообщению
caballero пишет:
Это внутренний формат - общеприняттый для сишных програм.
Не слышал такого, хотелось бы пруфов именно для php.

DlTA пишет:
фигня получится
Всё получилось няшно. Проверил так: создал два файла, которые записывают в файл результат serialize(array(1,2,"Текст")), файлы в кодировке утф-8 и цп-1251. После чего прочитал и восстановил. Всё прошло нормально, нужно только сменить кодировку у полученных данных и профит.

PHP:
скопировать код в буфер обмена
  1. <?PHP //utf.php
  2. echo serialize(array(1,2,"Текст"));
  3. $file = fopen("./utf.txt","w");
  4. fwrite($file, serialize(array(1,2,"Текст")));
  5. ?>


PHP:
скопировать код в буфер обмена
  1. <?PHP //_cp1251.php
  2. echo serialize(array(1,2,"Текст"));
  3. $file = fopen("./utf.txt","r");
  4. echo fread($file, 100500);
  5. ?>


Были ещё файлы cp1251.php и _utf.php для проверки в обратном направлении.
13. DlTA - 09 Ноября, 2011 - 13:37:21 - перейти к сообщению
Мелкий пишет:
Поведение полностью адекватное.

незнаю как для кого
но для меня было новостью что в utf-8
кирилица занимает в 2 раза больше чем для латиницы
и почему тогда не так же в win-1251?!
(Добавление)
serialize(array(1,2,"text"));
a:3:{i:0;i:1;i:1;i:2;i:2;s:4:"text";} utf-8
a:3:{i:0;i:1;i:1;i:2;i:2;s:4:"text";} win-1251
14. Самогонщик - 09 Ноября, 2011 - 13:41:20 - перейти к сообщению
DlTA пишет:
незнаю как для кого
но для меня было новостью что в utf-8
э.............................................................
*много нехороших слов*

http://ru[dot]wikipedia[dot]org/wiki/UTF-8
А тебя никогда не смущало, что утф-8 представляет миллион различных символов (юникод) в одном байте?
15. DlTA - 09 Ноября, 2011 - 13:43:02 - перейти к сообщению
Самогонщик пишет:
http://ru.wikipedia.org/wiki/UTF-8

мда, новость

 

Powered by ExBB FM 1.0 RC1