для чего нужны функции с префиксом mb

Модуль Mbstring для работы с многобайтными строками

Многобайтные строки, для которых используют специально разработанные схемы кодирования, могут содержать более, чем 256 символов. При этом функции для их обработки продолжают работать со строками, как будто они закодированы в обычной побайтовой системе.

Большинство функций PHP не умеют работать с многобайтными строками. При этом они будут возвращать совсем неправильный результат. Для правильной обработки данных строк, необходимо использовать специальные функции, так как в таких кодировках два или более последовательных байта могут задавать один символ.

Модуль Mbstring предоставляет функции для работы с многобайтными строками и занимается конвертированием строк из одной кодировки в другую. Также предназначен для работы с Unicode-кодировками, такими, как UTF-8 и UCS-2.

Модуль Mbstring не входит в список расширений, устанавливаемых по умолчанию. Для включения достаточно добавить в файле Php.ini следующую строку:
Большинство стандартных функций имеют аналоги для работы с многобайтными строками и отличаются только префиксом «mb_» и некоторыми параметрами кодировки.

Также необходимо четко задавать Mb_internal_encoding, которая устанавливает внутреннюю кодировку скрипта. В качестве параметра указывается кодировка, в которую будут преобразовываться входные данные HTTP запроса, из которой будет конвертироваться HTTP вывод, а также это кодировка по умолчанию для всех функций работающих со строками, определенными в модуле Mbstring:
Например, для функции Strlen аналогом служит функция Mb_strlen. Точно также и для других функций.

Приведем пример, который покажет различие в данных функциях:
Как видно из примера, функция Mb_strlen покажет правильное значение. Функция Strlen для строки ‘Вася Пупкин’ вернула 21 байт. Функция же Mb_strlen под­считала количество символов в строке с учетом того, что под разные символы от­водится разное количество байтов. В секции [mbstring] конфигурационного файла php.ini можно обнаружить директиву mbstring.func_overload, которая по умолчанию принимает значение 0. Если вы­ставить ее в значение 2, стандартные функции РНР будут заменяться их mbstring-aнaлoгaми. Переключив значение директивы и перезагрузив сервер, вы сможете убедиться в этом самостоятельно: функция Strlen из примеравернет пра­вильное значение в 11 символов. Но механизм перегрузки функций объявлен устаревшим и его использование крайне не рекомендовано.

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

Источник

Работа с многобайтовыми строками

Письменный язык, будь то английский, японский или любой другой, состоит из нескольких символов, поэтому существенная проблема при работе с языком в цифровом виде состоит в том, чтобы найти способ представлять каждый символ в цифровой форме. Раньше нам нужно было представлять только английские символы, но сегодня это совершенно другая игра с мячом, и в результате получается изумительное количество схем кодирования символов, используемых для представления символов во многих разных языках. Как PHP относится к этим различным схемам и справляется с ними?

Основы

Все мы знаем, что «бит» — это вещь, которая может быть 0 или 1 и ничем иным, а «байт» — это группа из восьми последовательных битов. Поскольку в байте имеется восемь таких двойных значений, один байт может быть сконфигурирован в общей сложности 256 различных шаблонов (от 2 до степени 8). С каждым возможным 8-битным шаблоном можно связать разные символы.

Соедините эти байты в разных порядках, и вы получите некоторое общение. Это не обязательно разумно, это зависит от того, кто на каждом конце, но это общение. Пока мы можем выразить символы языка 256 уникальными символами или меньше, мы настроены.

Но что, если мы не можем выразить язык всего 256 символами? Или что если нам нужно выразить несколько языков в одном документе? Сегодня, когда мы оцифровываем все, что можем найти, 256 символов далеко не достаточно. К счастью, были разработаны схемы персонажей, которые более соответствуют требованиям. Эти новые наборы суперсимволов используют от одного до четырех байтов для определения символов.

Большая собака в сегодняшней сцене кодирования символов — Unicode, схема, которая использует несколько байтов для представления символов. Он был разработан Консорциумом Юникод и существует несколько его версий: UTF-32, который используется на кораблях класса Dreadnaught, UTF-16, который используется на Star Trek: Into Darkness Enterprise, и UTF-8, который является тем, что большинство из нас в реальном мире должны использовать для наших веб-приложений.

Как я уже сказал, Unicode (включая UTF-8) использует многобайтовые конфигурации для представления символов. UTF-8 использует от одного до четырех байтов для создания 1,112,064 шаблонов, представляющих разные символы. Эти «широкие символы» занимают больше места, но UTF-8 имеет тенденцию быстрее обрабатывать, чем некоторые другие схемы кодирования.

Почему все говорят о UTF-8? Частично это горячие модели, которые были выделены в рекламных роликах поддержки UTF-8 на ESPN и TCM, но в основном это потому, что UTF-8 имитирует ASCII, и если у вас нет специальных символов, он точно отслеживает ASCII.

И это влияет на PHP Как?

Я знаю, о чем ты думаешь. Мне просто нужно установить набор символов в моих метатегах на «UTF-8», и все будет хорошо. Но это не правда.

Во-первых, простая истина заключается в том, что PHP на самом деле не предназначен для работы с многобайтовыми символами, и поэтому выполнение этих символов с помощью стандартных строковых функций может привести к неопределенным результатам. Когда нам нужно работать с этими многобайтовыми символами, нам нужно использовать специальный набор функций: функции mbstring.

И во-вторых, даже если у вас есть PHP под контролем, могут быть проблемы. Заголовки HTTP, охватывающие ваше сообщение, также содержат идентификацию набора символов, которая переопределяет то, что находится в метатеге вашей страницы.

Итак, как PHP работает с многобайтовыми символами? Есть две функциональные группы, которые влияют на многобайтовые строки.

Источник

Multibyte String Functions

Multibyte character encoding schemes and their related issues are fairly complicated, and are beyond the scope of this documentation. Please refer to the following URLs and other resources for further information regarding these topics.

    Japanese/Korean/Chinese character information

    Table of Contents

    User Contributed Notes 35 notes

    Please note that all the discussion about mb_str_replace in the comments is pretty pointless. str_replace works just fine with multibyte strings:

    = ‘漢字はユニコード’ ;
    $needle = ‘は’ ;
    $replace = ‘Foo’ ;

    ?>

    The usual problem is that the string is evaluated as binary string, meaning PHP is not aware of encodings at all. Problems arise if you are getting a value «from outside» somewhere (database, POST request) and the encoding of the needle and the haystack is not the same. That typically means the source code is not saved in the same encoding as you are receiving «from outside». Therefore the binary representations don’t match and nothing happens.

    PHP can input and output Unicode, but a little different from what Microsoft means: when Microsoft says «Unicode», it unexplicitly means little-endian UTF-16 with BOM(FF FE = chr(255).chr(254)), whereas PHP’s «UTF-16» means big-endian with BOM. For this reason, PHP does not seem to be able to output Unicode CSV file for Microsoft Excel. Solving this problem is quite simple: just put BOM infront of UTF-16LE string.

    SOME multibyte encodings can safely be used in str_replace() and the like, others cannot. It’s not enough to ensure that all the strings involved use the same encoding: obviously they have to, but it’s not enough. It has to be the right sort of encoding.

    UTF-8 is one of the safe ones, because it was designed to be unambiguous about where each encoded character begins and ends in the string of bytes that makes up the encoded text. Some encodings are not safe: the last bytes of one character in a text followed by the first bytes of the next character may together make a valid character. str_replace() knows nothing about «characters», «character encodings» or «encoded text». It only knows about the string of bytes. To str_replace(), two adjacent characters with two-byte encodings just looks like a sequence of four bytes and it’s not going to know it shouldn’t try to match the middle two bytes.

    While real-world examples can be found of str_replace() mangling text, it can be illustrated by using the HTML-ENTITIES encoding. It’s not one of the safe ones. All of the strings being passed to str_replace() are valid HTML-ENTITIES-encoded text so the «all inputs use the same encoding» rule is satisfied.

    The text is «x = ‘x ;
    mb_internal_encoding ( ‘HTML-ENTITIES’ );

    ?>

    Even though neither ‘l’ nor ‘;’ appear in the text «x y» and in the other it broke the encoding completely.

    One more reason to use UTF-8 if you can, I guess.

    Yet another single-line mb_trim() function

    PHP5 has no mb_trim(), so here’s one I made. It work just as trim(), but with the added bonus of PCRE character classes (including, of course, all the useful Unicode ones such as \pZ).

    Источник

    Настройка хостинга для работы с 1С-Битрикс

    для чего нужны функции с префиксом mb. Смотреть фото для чего нужны функции с префиксом mb. Смотреть картинку для чего нужны функции с префиксом mb. Картинка про для чего нужны функции с префиксом mb. Фото для чего нужны функции с префиксом mb

    Настройка хостинга для работы с 1С-Битрикс

    Приобретая дорогой тариф на хостинге или арендуя сервер или даже имея свой собственный, бывают ситуации, что заказчики сайта жалуются на медленную скорость работы сайта на 1С-Битрикс, причем версии сайта с демо-данными, т.е. бесплатной триальной 30 дневной версии продукта, которую можно свободно скачать с сайта 1c-bitrix.ru.

    Дело в том, что мало хороших характеристик виртуального или физического сервера, программное обеспечение должно быть настроено соответствующим образом, чтобы удовлетворять требованиям 1С-Битрикс. Однако верно и обратное, что настройки, при которых 1С-Битрикс работает быстро, будут хороши и для любой другой системы управления сайтом.

    Рассмотрим вариант, когда на сервере в качестве операционной системы выбран Linux.

    Какие же требования предъявляются к такому веб-серверу?

    Во-первых должен быть установлен php-акселератор (этот программный модуль кеширует скомпилированные php скрипты, которые могут в некомпилированном виде быть весьма большими по объему кода, а затем при запуске проверяет, если скрипты не были модифицированы, то сразу же выполняет их, увеличивая таким образом производительность работы в несколько раз). Пожалуй, не рекомендуется только eAccelerator из-за того, что поддержка продукта не осуществляется.

    Рекомендовать же можно APCu, как встроенный в php последних версий модуль, либо opCache, который считается самым производительным.

    Неплохо себя зарекомендовали xCache и APC.

    Во-вторых необходимо достаточное количество оперативной памяти! Если у вас будет версия продукта 1С-Битрикс Бизнес, то 512 Мб оперативной памяти будут минимальным требованием.

    Далее, нужно понять какой тип таблиц MySQL будет использован, рекомендуется использовать INNODB как более надежный вариант, но менее производительный, когда преобладают операции чтения, об этом подробнее поговорим ниже.

    Таким образом, считаем, что у нас есть хостинг тариф, например на VDS (виртуальном выделенном сервере), где мы можем настраивать php и MySQL так как нам нужно.

    Настройки PHP

    Для php нужны следующие настройки, которое мы разберем, и посмотрим, что они означают.

    1) Если вы собираетесь устанавливать 1С-Битрикс в кодировке utf-8 (рекомендуется делать именно так), то необходимо, чтобы была указана внутренняя кодировка и перегрузка почтовой и строковых функций (становятся доступны функции с префиксом mb_, например mb_strlen), если же продукт будет установлен в кодировке windows-1251, то эти строки не нужны

    2) Эта строка нужна для прохождения теста на корректность работы 1С-Битрикс (длина регулярных выражений)

    3) Кеширование реальных путей скриптов, а также время кеширования в секундах

    4) Временная зона. В рекомендациях 1С-Битрикс по синхронизации времени указана несколько устаревшая информация, попытка добавлять требуемые строки в файлы настроек системы приводят к неработоспособности продукта, поэтому реально нужна только эта настройка (используйте необходимую именно вам временную зону!) и настройка для базы данных, о чем будет сказано ниже

    5) Максимальное ограничение на число одновременно передаваемых переменных

    6) Настоятельно рекомендуется 1С-Битрикс, чтобы вывод ошибок по-умолчанию был включен. Редактировать настройку вывода ошибки и/или предупреждения можно и нужно в настройках главного модуля 1С-Битрикс в системе администрирования

    7) Настройки php-акселератора, например, у вас установлен акселератор APC (настройки для разных акселераторов, естественно будут разные, приведенные ниже настройки, рекомендованы 1С-Битрикс)

    8) Ограничение оперативной памяти, выделяемой скриптам, 1 Гб значение, которого вполне хватает для интернет-магазина на редакции Бизнес и нагрузке 2000 уникальных посетителей в сутки. Зависит от редакции, например для редакции Стандарт вполне хватит и 128 Мб.

    9) Эти настройки индивидуальные для каждого проекта, отвечают за размер загружаемых файлов через систему администрирования (максимальный размер файла и максимальный размер, передаваемый через формы методом POST)

    Важно! После того, как вы настроили php-акселератор, нужно указать его в настройках 1С-Битрикс.

    1. /bitrix/php_interface/dbconn.php

    Нужно добавить строчки (для акселератора APC):

    2. /bitrix/settings.php

    Настройки базы данных MySQL

    Теперь разберем, что делать с настройкой базы данных.

    Считаем, что тип таблиц MySQL у нас INNODB

    1) Размер буфера, для INNODB это фактический самая важная настройка, принцип простой, желательно, чтобы размер буфера был >= размер базы данных. Если база данных занимает 1Гб, отлично, если размер буфера будет 1Гб. Конечно, зависит эта настройка от количества оперативной памяти на вашем тарифе/VDS/сервере

    2) размер буфера лога, достаточная цифра для большинства проектов

    3) отключаем буферизацию таблиц для файловой системы, обращаемся напрямую к файлам базы данных

    4) При каждой транзакции база данных MySQL пишет лог, в данном случае каждые 2 секунды, с этим параметром нужно быть осторожнее, он сильно влияет на производительность. Но если в проекте критична очень целостность данных, например, производятся платежи, то здесь такая настройка не нужна.

    5) уровень изоляции транзакций, считать данные можно только после проведения транзакции

    Тестируем примененые настройки

    Напоследок посмотрим разницу показаний монитора производительности 1С-Битрикс, на примере тарифа облачной VDS, с параметрами образ Debian 7 LAMP (Apache + Nginx + MySQL)/2 ядра@2.6 Ггц/1024 Мб/20Гб SAS, php-акселератор APC. Установлена редакция Малый Бизнес.

    Источник

    Все используют (или скоро начнут!) UTF8 в эти дни.

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

    UTF8 и PHP

    Используйте функции с префиксом mb_, если вы знаете, что работаете со строками, которые могут содержать символы UTF8. Итак, если вы хотите посчитать длину такой строки:

    Если вы просто манипулируете строками, вам не всегда нужно использовать эти более медленные и UTF8-ориентированные функции. Но в условиях лучше использовать именно их.

    UTF8 и preg_match()

    Теперь это сложный вопрос, особенно если вы не хотите перекомпилировать PHP с включенным флагом PCRE UTF-8 или вообще не знаете об этом. ИМХО это должно быть по умолчанию, но обычно это не так.

    В большинстве случаев при работе со строками UTF8 модификаторы /u и p помогают:

    В других случаях вам может потребоваться добавить (* UTF8) в ваш шаблон.

    UTF8 и CakePHP

    Установка CakePHP

    Основные части описаны в книге, особенно в разделе «Начало работы».

    Убедитесь, что вы сохранили все файлы как «UTF8 без BOM» через IDE, как только они начнут содержать символы UTF8. Несоблюдение этого требования приведет к проблемам с выводом.

    Я обычно стараюсь избегать этого и использую перевод Locale и в основном английские символы во всех файлах, насколько это возможно.

    Примечание. Перед добавлением в файлы любых символов UTF8 эти файлы всегда имеют формат ANSI (без спецификации невозможно различить эти два формата кодирования, поскольку они практически одинаковы). Поэтому независимо от того, как часто вы пытаетесь сохранить их как UTF8, они всегда будут ANSI. В случае, если вы удивляетесь, почему в большинстве сред IDE это происходит автоматически.

    Исправление функций PHP

    Некоторые функции PHP были обернуты в CakePHP, чтобы преодолеть недостатки, связанные с Unicode.

    Например, String::wordWrap() заменяет неисправную функцию wordwrap().

    Я также добавил несколько исправлений в свой плагин Tools как класс Utility/Utility:

    Но это наверное, еще не все …

    Правильная валидация

    Они могут предположить, что работают просто с использованием strlen() или регулярного выражения [a-z] или тому подобного, не принимая во внимание, что, например, многие нормальные имена/фамилии содержат много специальных символов.

    Валидация здесь никогда не должна быть слишком строгой. В противном случае многие люди будут очень расстроены.

    Таким образом, в приведенном выше примере мы не должны использовать

    а что-то более похожее на

    Подобную вещь я должен был исправить некоторое время назад, в отношении URL.

    Источник

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *