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 :: Версия для печати :: Вопрос по работе с кодировками
Форумы портала PHP.SU » » Кодировки и все смежное » Вопрос по работе с кодировками

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

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

нет, можно перевести вручную iconv()
3. DeepVarvar - 13 Октября, 2011 - 20:18:35 - перейти к сообщению
OrmaJever пишет:
можно
а он видит что не нужно... вот и спрашивает... я в ступоре.
(Добавление)
OrmaJever пишет:
Какой имено текст вы ищите?
да да - тот же вопрос на языке болтался.
4. Pavelbeginner - 13 Октября, 2011 - 20:35:32 - перейти к сообщению
Да, искал английский шаблон в английском файле. Попробовав искать кириллицу и ничего не вышло.

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

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

3) И последний вопрос по теме. Есть ф-ция, которая возвращает кол-во символов в строке(strlen). Как ф-ция определяет с какой кодировкой работает? В разных кодировках же разное кол-во байт на один символ.
5. Мелкий - 13 Октября, 2011 - 20:36:39 - перейти к сообщению
Pavelbeginner, ответ прост - обе кодировки полностью совместимы с ASCII. Поэтому вы когда-нибудь видели многообразие тем о кодировках на англоязычных сайтах? Для них эта проблема так же актуальна, как для русскоговорящих - поддержка умляутов немецкого языка.
(Добавление)
Pavelbeginner пишет:
Если в utf-8 первые 128 символов однобайтные, то как, например, текстовые редакторы отличают остальные символы utf-8 от этих 128 символов?

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

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

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

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

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

strlen - никак.
mb_strlen - смотря какой указан в параметрах или глобально. См описание функции
6. DeepVarvar - 13 Октября, 2011 - 20:44:19 - перейти к сообщению
Pavelbeginner echo strlen("Вася"); echo strlen("John");
(Добавление)
Мелкий пишет:
Символов - mb_strlen.
Подмигивание echo strlen("ВасяJohn");
(Добавление)
echo mb_strlen("ВасяJohn");
7. Мелкий - 13 Октября, 2011 - 20:56:14 - перейти к сообщению
DeepVarvar пишет:
echo strlen("ВасяJohn");
(Добавление)
echo mb_strlen("ВасяJohn");

Кодировка не та стоит. Можешь явно указать: echo mb_strlen("ВасяJohn",'UTF8'); результат ожидаемый, 8.
8. Pavelbeginner - 13 Октября, 2011 - 21:20:28 - перейти к сообщению
Можете сказать правильно ли я понял с кодировками?:
Изначально была 7-битная кодировка ascii. В нее входили цифры, Латинский алфавит, ну и еще какая-то мелочь.

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

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

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

И еще вопрос в чём разница между кодовой страницей и кодировкой не могу понять?
9. Мелкий - 13 Октября, 2011 - 21:31:44 - перейти к сообщению
Pavelbeginner пишет:
Затем стало нужно представлять в компьютере языки не латинские.

А затем - неанглоязычные люди поняли, что в байте - 8 бит, а используется в ASCII - 7. И появилась куча всевозможных кодировок, да.
Вообще, рекомендую книжку "Джоэл о программировании" прочитать, тема кодировок раскрыта весьма хорошо, помимо ещё кучки полезностей вкупе с приятным слогом автора.
10. Pavelbeginner - 14 Октября, 2011 - 10:55:01 - перейти к сообщению
Спасибо. А можно еще узнать в чем разница между текстовыми и бинарными файлами? Читал читал, не могу понять.
11. Мелкий - 14 Октября, 2011 - 11:26:02 - перейти к сообщению
Текстовые - может читать и редактировать человек, вооружившись любым текстовым редактором.
Бинарные - затруднится, нужен реактор, умеющий слопать этот конкретный формат.

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

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

(Добавление)
http://russian[dot]joelonsoftware[dot]com/index[dot]html
14. DeepVarvar - 15 Октября, 2011 - 10:48:32 - перейти к сообщению
Мелкий пишет:
Кодировка не та стоит. Можешь явно указать: echo mb_strlen("ВасяJohn",'UTF8'); результат ожидаемый, 8.
т.е локаль явно не цепляет и надо носом ткнуть?
15. Мелкий - 15 Октября, 2011 - 11:29:08 - перейти к сообщению
DeepVarvar, т.е. mb_internal_encoding не туда смотрит. Можно или ей указать или в php.ini или каждой mb_ функции в соответствующий параметр.

 

Powered by ExBB FM 1.0 RC1