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 :: Вопрос по работе с кодировками
Покинул форум
Сообщений всего: 882
Дата рег-ции: Март 2010
Помог: 1 раз(а)
Есть текстовый файл test.txt в кодировке utf-8.
В нем какой-то текст.
В своём скрипте я вызываю ф-цию stristr и передаю ей в качестве первого параметра содержимое файла test.txt, в качестве второго параметра(шаблона поиска) задаю какое-то слово. делаю echo результат работы ф-ции. Скрипт сохранен в кодировке window-1251, следовательно и второй параметр, передаваемый в ф-цию stristr сохранен в windows1251. То есть ведется поиск в строке в кодировке utf-8 по шаблона в кодировке windows-1251. И это все работает так, как-будто и содержимое файла и шаблон сохранены в одной кодировке! Почему так? Почему php работая с данными в разных кодировках, как-то понимает и все делает правильно как-будто бы все данные в одной кодировке?? Поясните, пожалуйста. Или php предварительно все данные переводит в единую кодировку?
OrmaJever
Отправлено: 13 Октября, 2011 - 20:13:09
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
в utf-8 первые 128 символов однобайтовые. А в это 128 символов входят и цыфрыи англиские буквы и ещё что-то. Какой имено текст вы ищите?
Pavelbeginner пишет:
Или php предварительно все данные переводит в единую кодировку?
Покинул форум
Сообщений всего: 882
Дата рег-ции: Март 2010
Помог: 1 раз(а)
Да, искал английский шаблон в английском файле. Попробовав искать кириллицу и ничего не вышло.
Если в utf-8 первые 128 символов однобайтные, то как, например, текстовые редакторы отличают остальные символы utf-8 от этих 128 символов? Остальные же символы состоят из нескольких байт. То есть почему бы редактору не посчитать один двух байтный символ за 2 однобайтных? И подскажите, пожалуйста, сколько байт содержат остальные символы после 128 в utf-8(это можно конечно и погуглить, но надеюсь Вы подскажите).
2) И правильно ли я понимаю, что php интерпретатор правильно разбирает php-скрипт, написанный в разных кодировках только потому, что все кодировки содержат одинаковые и однобайтные 128 символов?
3) И последний вопрос по теме. Есть ф-ция, которая возвращает кол-во символов в строке(strlen). Как ф-ция определяет с какой кодировкой работает? В разных кодировках же разное кол-во байт на один символ.
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Pavelbeginner, ответ прост - обе кодировки полностью совместимы с ASCII. Поэтому вы когда-нибудь видели многообразие тем о кодировках на англоязычных сайтах? Для них эта проблема так же актуальна, как для русскоговорящих - поддержка умляутов немецкого языка. (Добавление)
Pavelbeginner пишет:
Если в utf-8 первые 128 символов однобайтные, то как, например, текстовые редакторы отличают остальные символы utf-8 от этих 128 символов?
По оставшемуся биту. Если он ноль - значит символ кончился. Если 1 - значит это не последний байт символа. В том и весь фокус UTF
Pavelbeginner пишет:
И правильно ли я понимаю, что php интерпретатор правильно разбирает php-скрипт, написанный в разных кодировках только потому, что все кодировки содержат одинаковые и однобайтные 128 символов?
Не совсем так - правильно работает потому, что все значащие для разбора символы укладываются в ASCII. (Добавление)
Pavelbeginner пишет:
Есть ф-ция, которая возвращает кол-во символов в строке(strlen).
Кодировка не та стоит. Можешь явно указать: echo mb_strlen("ВасяJohn",'UTF8'); результат ожидаемый, 8.
----- PostgreSQL DBA
Pavelbeginner
Отправлено: 13 Октября, 2011 - 21:20:28
Частый посетитель
Покинул форум
Сообщений всего: 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 без проблем разбирает скрипт.
И еще вопрос в чём разница между кодовой страницей и кодировкой не могу понять?
Мелкий
Отправлено: 13 Октября, 2011 - 21:31:44
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Pavelbeginner пишет:
Затем стало нужно представлять в компьютере языки не латинские.
А затем - неанглоязычные люди поняли, что в байте - 8 бит, а используется в ASCII - 7. И появилась куча всевозможных кодировок, да.
Вообще, рекомендую книжку "Джоэл о программировании" прочитать, тема кодировок раскрыта весьма хорошо, помимо ещё кучки полезностей вкупе с приятным слогом автора.
----- PostgreSQL DBA
Pavelbeginner
Отправлено: 14 Октября, 2011 - 10:55:01
Частый посетитель
Покинул форум
Сообщений всего: 882
Дата рег-ции: Март 2010
Помог: 1 раз(а)
Спасибо. А можно еще узнать в чем разница между текстовыми и бинарными файлами? Читал читал, не могу понять.
Мелкий
Отправлено: 14 Октября, 2011 - 11:26:02
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Текстовые - может читать и редактировать человек, вооружившись любым текстовым редактором.
Бинарные - затруднится, нужен реактор, умеющий слопать этот конкретный формат.
Собственно, и вся разница.
----- PostgreSQL DBA
LIME
Отправлено: 14 Октября, 2011 - 11:39:11
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
примеры приведу
при открытии удаленного файла между виндой и *nix в текстовом режиме окончание строки автоматически меняется с \n на \r\n или обратно...текст при сохранится неизменным но файл то изменится
а при бинарном режиме все передается тютелька в тютельку...можно считать что бинарный файл это программа в которой нельзя менять ни одного байта
или тотже колэйшн в мускуле...если указать bin то регистр будет влиять...байт то другой
скомкано получилось зато про войну )) (Добавление)
для текстового файла характерны понятия как длина строки, кодировка итд
а бинарник это набор байтов и неважно каких
LIME
Отправлено: 15 Октября, 2011 - 06:39:30
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
Мелкий пишет:
Вообще, рекомендую книжку "Джоэл о программировании" прочитать, тема кодировок раскрыта весьма хорошо, помимо ещё кучки полезностей вкупе с приятным слогом автора.
"Джоэл о программировании" пишет:
... которым нужны Cвepкающие кнопки OK/Cancel, способные отражать (простите, какое значение RGB для цвета (.отражающий"?). И искать ...
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.