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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Вопрос по работе с кодировками

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Pavelbeginner
Отправлено: 13 Октября, 2011 - 19:37:07
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 882
Дата рег-ции: Март 2010  


Помог: 1 раз(а)




Есть текстовый файл test.txt в кодировке utf-8.
В нем какой-то текст.
В своём скрипте я вызываю ф-цию stristr и передаю ей в качестве первого параметра содержимое файла test.txt, в качестве второго параметра(шаблона поиска) задаю какое-то слово. делаю echo результат работы ф-ции. Скрипт сохранен в кодировке window-1251, следовательно и второй параметр, передаваемый в ф-цию stristr сохранен в windows1251. То есть ведется поиск в строке в кодировке utf-8 по шаблона в кодировке windows-1251. И это все работает так, как-будто и содержимое файла и шаблон сохранены в одной кодировке! Почему так? Почему php работая с данными в разных кодировках, как-то понимает и все делает правильно как-будто бы все данные в одной кодировке?? Поясните, пожалуйста. Или php предварительно все данные переводит в единую кодировку?
 
 Top
OrmaJever Модератор
Отправлено: 13 Октября, 2011 - 20:13:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




в utf-8 первые 128 символов однобайтовые. А в это 128 символов входят и цыфрыи англиские буквы и ещё что-то. Какой имено текст вы ищите?
Pavelbeginner пишет:
Или php предварительно все данные переводит в единую кодировку?

нет, можно перевести вручную iconv()


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DeepVarvar Супермодератор
Отправлено: 13 Октября, 2011 - 20:18:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




OrmaJever пишет:
можно
а он видит что не нужно... вот и спрашивает... я в ступоре.
(Добавление)
OrmaJever пишет:
Какой имено текст вы ищите?
да да - тот же вопрос на языке болтался.
 
 Top
Pavelbeginner
Отправлено: 13 Октября, 2011 - 20:35:32
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 882
Дата рег-ции: Март 2010  


Помог: 1 раз(а)




Да, искал английский шаблон в английском файле. Попробовав искать кириллицу и ничего не вышло.

Если в utf-8 первые 128 символов однобайтные, то как, например, текстовые редакторы отличают остальные символы utf-8 от этих 128 символов? Остальные же символы состоят из нескольких байт. То есть почему бы редактору не посчитать один двух байтный символ за 2 однобайтных? И подскажите, пожалуйста, сколько байт содержат остальные символы после 128 в utf-8(это можно конечно и погуглить, но надеюсь Вы подскажите).

2) И правильно ли я понимаю, что php интерпретатор правильно разбирает php-скрипт, написанный в разных кодировках только потому, что все кодировки содержат одинаковые и однобайтные 128 символов?

3) И последний вопрос по теме. Есть ф-ция, которая возвращает кол-во символов в строке(strlen). Как ф-ция определяет с какой кодировкой работает? В разных кодировках же разное кол-во байт на один символ.

(Отредактировано автором: 13 Октября, 2011 - 20:39:55)

 
 Top
Мелкий Супермодератор
Отправлено: 13 Октября, 2011 - 20:36:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Pavelbeginner, ответ прост - обе кодировки полностью совместимы с ASCII. Поэтому вы когда-нибудь видели многообразие тем о кодировках на англоязычных сайтах? Для них эта проблема так же актуальна, как для русскоговорящих - поддержка умляутов немецкого языка.
(Добавление)
Pavelbeginner пишет:
Если в utf-8 первые 128 символов однобайтные, то как, например, текстовые редакторы отличают остальные символы utf-8 от этих 128 символов?

По оставшемуся биту. Если он ноль - значит символ кончился. Если 1 - значит это не последний байт символа. В том и весь фокус UTF

Pavelbeginner пишет:
И правильно ли я понимаю, что php интерпретатор правильно разбирает php-скрипт, написанный в разных кодировках только потому, что все кодировки содержат одинаковые и однобайтные 128 символов?

Не совсем так - правильно работает потому, что все значащие для разбора символы укладываются в ASCII.
(Добавление)
Pavelbeginner пишет:
Есть ф-ция, которая возвращает кол-во символов в строке(strlen).

Не символов, а байтов.
Символов - mb_strlen.

Pavelbeginner пишет:
Как ф-ция определяет с какой кодировкой работает?

strlen - никак.
mb_strlen - смотря какой указан в параметрах или глобально. См описание функции


-----
PostgreSQL DBA
 
 Top
DeepVarvar Супермодератор
Отправлено: 13 Октября, 2011 - 20:44:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Pavelbeginner echo strlen("Вася"); echo strlen("John");
(Добавление)
Мелкий пишет:
Символов - mb_strlen.
Подмигивание echo strlen("ВасяJohn");
(Добавление)
echo mb_strlen("ВасяJohn");
 
 Top
Мелкий Супермодератор
Отправлено: 13 Октября, 2011 - 20:56:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




DeepVarvar пишет:
echo strlen("ВасяJohn");
(Добавление)
echo mb_strlen("ВасяJohn");

Кодировка не та стоит. Можешь явно указать: echo mb_strlen("ВасяJohn",'UTF8'); результат ожидаемый, 8.


-----
PostgreSQL DBA
 
 Top
Pavelbeginner
Отправлено: 13 Октября, 2011 - 21:20:28
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 882
Дата рег-ции: Март 2010  


Помог: 1 раз(а)




Можете сказать правильно ли я понял с кодировками?:
Изначально была 7-битная кодировка ascii. В нее входили цифры, Латинский алфавит, ну и еще какая-то мелочь.

Затем стало нужно представлять в компьютере языки не латинские. Для этого на базе ascii создавались 8-битные кодировки. Например, для русского языка создали windows-1251, KOI8 и прочие кодировки. А на базе ascii потому, что первые 128 символов в каждой такой кодировке содержат все символы кодировки ascii.

Затем, чтобы не возиться с кучей кодировок для удобства придумали кодировку unicod. Она также совместима с ascii т.к. первые 128 символов из кодировки ascii. Для каждого языка выделен диапазон, например(из головы), для русского языка выделен диапазон в двоичной системе от 00000000 11111111 до 00001111 11111111.

И собственно т.к. все перечисленные мной кодировки (8-битные, utf) содержат первые 128 символов кодировки ascii, а php использует именно их, то php без проблем разбирает скрипт.

И еще вопрос в чём разница между кодовой страницей и кодировкой не могу понять?
 
 Top
Мелкий Супермодератор
Отправлено: 13 Октября, 2011 - 21:31:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Pavelbeginner пишет:
Затем стало нужно представлять в компьютере языки не латинские.

А затем - неанглоязычные люди поняли, что в байте - 8 бит, а используется в ASCII - 7. И появилась куча всевозможных кодировок, да.
Вообще, рекомендую книжку "Джоэл о программировании" прочитать, тема кодировок раскрыта весьма хорошо, помимо ещё кучки полезностей вкупе с приятным слогом автора.


-----
PostgreSQL DBA
 
 Top
Pavelbeginner
Отправлено: 14 Октября, 2011 - 10:55:01
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 882
Дата рег-ции: Март 2010  


Помог: 1 раз(а)




Спасибо. А можно еще узнать в чем разница между текстовыми и бинарными файлами? Читал читал, не могу понять.
 
 Top
Мелкий Супермодератор
Отправлено: 14 Октября, 2011 - 11:26:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Текстовые - может читать и редактировать человек, вооружившись любым текстовым редактором.
Бинарные - затруднится, нужен реактор, умеющий слопать этот конкретный формат.

Собственно, и вся разница.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 14 Октября, 2011 - 11:39:11
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




примеры приведу
при открытии удаленного файла между виндой и *nix в текстовом режиме окончание строки автоматически меняется с \n на \r\n или обратно...текст при сохранится неизменным но файл то изменится
а при бинарном режиме все передается тютелька в тютельку...можно считать что бинарный файл это программа в которой нельзя менять ни одного байта
или тотже колэйшн в мускуле...если указать bin то регистр будет влиять...байт то другой
скомкано получилось зато про войну ))
(Добавление)
для текстового файла характерны понятия как длина строки, кодировка итд
а бинарник это набор байтов и неважно каких
 
 Top
LIME
Отправлено: 15 Октября, 2011 - 06:39:30
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)





Мелкий пишет:
Вообще, рекомендую книжку "Джоэл о программировании" прочитать, тема кодировок раскрыта весьма хорошо, помимо ещё кучки полезностей вкупе с приятным слогом автора.
"Джоэл о программировании" пишет:
... которым нужны Cвepкающие кнопки OK/Cancel, способные отражать (простите, какое значение RGB для цвета (.отражающий"?). И искать ...
ААААА Ха-ха +1

(Добавление)
http://russian[dot]joelonsoftware[dot]com/index[dot]html
 
 Top
DeepVarvar Супермодератор
Отправлено: 15 Октября, 2011 - 10:48:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Мелкий пишет:
Кодировка не та стоит. Можешь явно указать: echo mb_strlen("ВасяJohn",'UTF8'); результат ожидаемый, 8.
т.е локаль явно не цепляет и надо носом ткнуть?
 
 Top
Мелкий Супермодератор
Отправлено: 15 Октября, 2011 - 11:29:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




DeepVarvar, т.е. mb_internal_encoding не туда смотрит. Можно или ей указать или в php.ini или каждой mb_ функции в соответствующий параметр.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Кодировки и все смежное »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB