Progress28.ru

IT Новости
5 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Php setlocale utf 8

setlocale

(PHP 4, PHP 5, PHP 7)

setlocale — Устанавливает настройки локали

Описание

Устанавливает настройки локали.

Информация о локали модифицируется во всем процессе, а не по каждому потоку отдельно. Если вы используете PHP на многопоточном сервере, таком как IIS, HHVM или Apache под Windows, вы можете обнаружить неожиданные изменения в настройках локали во время выполнения скриптов, никогда и не вызывавших setlocale() . Это происходит из-за того, что другие скрипты, запущенные в параллельных потоках данного процесса, в то же самое время поменяли настройки локали для всего процесса с помощью setlocale() .

Список параметров

Параметр category — это именованная константа, определяющая категорию функций, на которые будет влиять установка локали:

  • LC_ALL — все нижеперечисленное
  • LC_COLLATE — функции сравнения строк, см. strcoll()
  • LC_CTYPE — функции преобразования и классификации строк, например strtoupper()
  • LC_MONETARY — для функции localeconv()
  • LC_NUMERIC — задает символ десятичного разделения (см. также localeconv() )
  • LC_TIME — форматирование даты/времени функцией strftime()
  • LC_MESSAGES — для системных сообщений (доступна, если PHP был скомпилирован с поддержкой libintl)

Если в качестве locale передана пустая строка «» или NULL , имена локалей будут взяты из одноименных переменных окружения или переменной с именем «LANG».

Если в качестве locale передан «0», локаль изменена не будет, а будет возвращено текущее значение.

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

(Необязательные аргументы в виде строк или массивов для установки настроек локали до первой успешной попытки.)

На Windows setlocale(LC_ALL, ») устанавливает имена локалей из системных региональных/языковых настроек (доступных через Панель Управления).

Возвращаемые значения

Возвращает имя вновь установленной локали или FALSE , если система не поддерживает установку локали, указанная локаль не существует или передано недопустимое имя категории.

Недопустимое имя категории также вызывает предупреждение. Имена локалей и категорий описаны в » RFC 1766 и » ISO 639. Разные системы имеют различные схемы именования локалей.

Возвращаемое функцией setlocale() значение зависит от системы, на которой запущен PHP. Она возвращает точно то же значение, что и системная функция setlocale.

Список изменений

ВерсияОписание
7.0.0Удалена поддержка для параметра category , передаваемого как строка. С текущей версии можно пользоваться только константами LC_*.
5.3.0Эта функция в настоящее время бросает уведомления E_DEPRECATED , если строка передается в параметре category вместо одной из констант LC_*.

Примеры

Пример #1 Примеры использования setlocale()

/* Установка голландской локали */
setlocale ( LC_ALL , ‘nl_NL’ );

/* выводит: vrijdag 22 december 1978 */
echo strftime ( «%A %e %B %Y» , mktime ( 0 , 0 , 0 , 12 , 22 , 1978 ));

/* попытка использовать различные локали для немецкого языка */
$loc_de = setlocale ( LC_ALL , ‘de_DE@euro’ , ‘de_DE’ , ‘de’ , ‘ge’ );
echo «На этой системе немецкая локаль имеет имя ‘ $loc_de ‘» ;
?>

Пример #2 Примеры использования setlocale() в Windows

/* Установка голландской локали */
setlocale ( LC_ALL , ‘nld_nld’ );

/* выводит: vrijdag 22 december 1978 */
echo strftime ( «%A %d %B %Y» , mktime ( 0 , 0 , 0 , 12 , 22 , 1978 ));

/* попытка использовать различные локали для немецкого языка */
$loc_de = setlocale ( LC_ALL , ‘de_DE@euro’ , ‘de_DE’ , ‘deu_deu’ );
echo «Предпочитаемая немецкая локаль на этой системе: ‘ $loc_de ‘» ;
?>

Примечания

Пользователи Windows найдут полезной информацию о значениях locale на сайте Microsoft MSDN . Поддерживаемые языки перечислены в » документации по языковым строкам, а значения стран/регионов в » документации по строкам стран/регионов.

User Contributed Notes 31 notes

be careful with the LC_ALL setting, as it may introduce some unwanted conversions. For example, I used

setlocale (LC_ALL, «Dutch»);

to get my weekdays in dutch on the page. From that moment on (as I found out many hours later) my floating point values from MYSQL where interpreted as integers because the Dutch locale wants a comma (,) instead of a point (.) before the decimals. I tried printf, number_format, floatval. all to no avail. 1.50 was always printed as 1.00 🙁

When I set my locale to :

setlocale (LC_TIME, «Dutch»);

my weekdays are good now and my floating point values too.

I hope I can save some people the trouble of figuring this out by themselves.

If you are looking for a getlocale() function simply pass 0 (zero) as the second parameter to setlocale().

Beware though if you use the category LC_ALL and some of the locales differ as a string containing all the locales is returned:

echo setlocale ( LC_ALL , 0 );

// LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;LC_NAME=C;
// LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_ >
echo setlocale ( LC_CTYPE , 0 );

setlocale ( LC_ALL , «en_US.UTF-8» );
echo setlocale ( LC_ALL , 0 );

?>

If you are looking to store and reset the locales you could do something like this:

= explode ( «;» , setlocale ( LC_ALL , 0 ));
setlocale ( LC_ALL , «nb_NO.utf8» );

foreach ( $originalLocales as $localeSetting ) <
if ( strpos ( $localeSetting , «=» ) !== false ) <
list ( $category , $locale ) = explode ( «=» , $localeSetting );
>
else <
$category = LC_ALL ;
$locale = $localeSetting ;
>
setlocale ( $category , $locale );
>

?>

The above works here (Ubuntu Linux) but as the setlocale() function is just wrapping the equivalent system calls, your mileage may vary on the result.

It took me a while to figure out how to get a Finnish locale correctly set on Ubuntu Server with Apache2 and PHP5.

At first the output for «locale -a» was this:
C
en_US.utf8
POSIX

I had to install a finnish language pack with
«sudo apt-get install language-pack-fi-base»

Now the output for «locale -a» is:
C
en_US.utf8
fi_FI.utf8
POSIX

The last thing you need to do after installing the correct language pack is restart Apache with «sudo apache2ctl restart». The locale «fi_FI.utf8» can then be used in PHP5 after restarting Apache.

For setting Finnish timezone and locale in PHP use:
( ‘Europe/Helsinki’ );
setlocale ( LC_ALL , array( ‘fi_FI.UTF-8’ , ‘fi_FI@euro’ , ‘fi_FI’ , ‘finnish’ ));
?>

The «locale» always depend on the server configuration.

i.e.:
When trying to use «pt_BR» on some servers you will ALWAYS get false. Even with other languages.

The locale string need to be supported by the server. Sometimes there are diferents charsets for a language, like «pt_BR.utf-8» and «pt_BR.iso-8859-1», but there is no support for a _standard_ «pt_BR».

This problem occours in Windows platform too. Here you need to call «portuguese» or «spanish» or «german» or.

Maybe the only way to try to get success calling the function setlocale() is:
setlocale(LC_ALL, «pt_BR», «pt_BR.iso-8859-1», «pt_BR.utf-8», «portuguese», . );

But NEVER trust on that when making functions like date conversions or number formating. The best way to make sure you are doing the right thing, is using the default «en_US» or «en_UK», by not calling the setlocale() function. Or, make sure that your server support the lang you want to use, with some tests.

Remember that: Using the default locale setings is the best way to «talk» with other applications, like dbs or rpc servers, too.

Php setlocale utf 8

Установка региональных настроек.
Синтаксис:

Функция setlocale устанавливает текущую локаль, с которой будут работать функции преобразования регистра символов, вывода даты-времени и т.д. Вообще говоря, для каждой категории функций локаль определяется отдельно и выглядит по-разному.
То, какую именно категорию функций затронет вызов setlocale(), задается в параметре category. Он может принимать следующие строковые значения:

LC_CTYPE — активизирует указанную локаль для функций перевода в верхний/нижний регистры;
LC_NUMERIC — активизирует локаль для функций форматирования дробных чисел — а именно, задает
разделитель целой и дробной части в числах;
LC_TIME — задает формат вывода даты и времени по умолчанию;
LC_ALL — устанавливает все вышеперечисленные режимы.
Теперь поговорим о параметре locale. Как известно, каждая локаль, установленная в системе, имеет свое уникальное имя, по которому к ней можно обратиться. Именно оно и фиксируется в этом параметре. Однако, есть два важных исключения из этого правила.
Во-первых, если величина locale равна пустой строке «», то устанавливается та локаль, которая указана в глобальной переменной окружения с именем, совпадающем с именем категории category (или LANG — она практически всегда присутствует в Unix).

Во-вторых, если в этом параметре передается 0, то новая локаль не устанавливается, а просто возвращается имя текущей локали для указанного режима.

Возвращает информацию о числовых форматах (PHP 4 >= 4.0.5, PHP 5)

Возвращает ассоциативный массив с информацией о числовых и денежных форматах в текущей локали.

localeconv() возвращает данные, основанные на текущей локали, установленной функцией setlocale(). Возвращаемый массив содержит следующие элементы:

ЭлементОписание
decimal_pointСимвол десятичной точки
thousands_sepРазделитель групп
groupingМассив, содержащий количества цифр в группах для числовых данных
int_curr_symbolМеждународное обозначение валюты (например RUR)
currency_symbolНациональное обозначение валюты (например р.)
mon_decimal_pointСимвол десятичной точки в денежном формате
mon_thousands_sepРазделитель групп в денежном формате
mon_groupingМассив, содержащий количества цифр в группах для денежных данных
positive_signЗнак для положительных чисел
negative_signЗнак для отрицательных чисел
int_frac_digitsЧисло разрядов после точки (международное)
frac_digitsЧисло разрядов после точки (национальное)
p_cs_precedesTRUE если currency_symbol записывется перед положительным значением, иначе FALSE
p_sep_by_spaceTRUE если currency_symbol отделяется от положительного значения пробелом, иначе FALSE
n_cs_precedesTRUE если currency_symbol записывется перед отрицательным значением, иначе FALSE
n_sep_by_spaceTRUE если currency_symbol отделяется от отрицательного значения пробелом, иначе FALSE
p_sign_posnДля положительных чисел
0 Число и обозначение валюты заключаются в скобки
1 Знак записывается перед числом и обозначением валюты
2 Знак записывается после числа и обозначения валюты
3 Знак записывается перед обозначением валюты
4 Знак записывается после обозначения валюты
n_sign_posnДля отрицательных чисел
0 Число и обозначение валюты заключаются в скобки
1 Знак записывается перед числом и обозначением валюты
2 Знак записывается после числа и обозначения валюты
3 Знак записывается перед обозначением валюты
4 Знак записывается после обозначения валюты

Элементы группировки описывают способ группировки цифр. Например, в локали en_US элемент grouping содержит массив из 2 элементов со значениями 3 и 3. Больший индек массива соответствует группировке цифр, расположенных левее. Если элемент массива равен CHAR_MAX, последующие цифры не группируются. Если элемент массива равен 0, используется значение предыдущего элемента.

Пример использования localeconv()n»;
?>

Использование константы CHAR_MAX описано выше.

Форматирует число как денежную величину (PHP 4 >= 4.3.0, PHP 5)

money_format() форматирует число number как денежную величину. Эта функция вызывает функцию strfmon языка C, но позволяет преобразовать только одно число за один вызов.

Замечание: Функция money_format() определена только если в системе присутствует функция strfmon. Например, в Windows она отсутствует, поэтому money_format() не определена в Windows.

Описание формата состоит из:

• символа %
• необязательных флагов
• необязательной ширины поля
• необязательной точности до запятой
• необязательной точности после запятой
• обязательного описателя преобразования

Флаги. Могут быть использованы следующие флаги:

=fСимвол =, за которым следует еще один символ, задает символ заполнения. По умолчанию пробел.
^Запрещает группировку символов (определяемую текущей локалью).
+
или
(
Задает способ форматирования положительных и отрицательных значений. При использовании + будут использоваться аналоги символов + и — из текущей локали. Если указана (, отрицательные числа будут заключены в скобки. По умолчанию +.
!Подавляет вывод символа валюты.
Если этот флаг задан, поля будут выравнены влево, вместо используемого по умолчанию выравнивания вправо.

Строка из десятичных цифр, задающая минимальную ширину поля. Поле будет выравнено вправо, если не указан флаг -. Значение по умолчанию — 0 (ноль).

Точность до запятой.

Максимальное количество цифр (n), которое ожидается до запятой. Это обычно используется при выводе значений одно под другим, чтобы десятичные точки распологались в одной колонке, при этом используется символ заполнения, если число цифр меньше n. Если число цифр больше n, этот параметр игнорируется.

Если группировка не была запрещена флагом ^, разделители групп будут вставлены перед добавлением символов заполнения. Разделители групп не вставляются между символами заполнения, даже если заполнитель — цифра.

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

Точность после запятой .

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

Используется международный денежный формат из текущей локали (например, для американской локали: USD 1,234.56).

Используется национальный денежный формат из текущей локали (например, для локали de_DE: DM1.234,56).

Замечание: На работу этой функции влияет установка категории LC_MONETARY текущей локали. Перед использованием этой функции установите нужную локаль с помощью setlocale().

Символы перед и после описания формата возвращаются без изменений.

Пример использования money_format()

Проиллюстрируем применение этой функции для различных локалей и разных описаний формата.

Возвращает информацию о языке и локали (PHP 4 >= 4.1.0, PHP 5)

nl_langinfo() используется для доступа к отдельным элементам различных категорий текущей локали. В отличии от localeconv(), возвращающей все элементы, nl_langinfo() позволяет выбрать отдельный элемент.

Если аргумент item имеет недопустимое значение, возвращает FALSE.

item может быть целым числом или соответствующей константой. Ниже приведены возможные константы и их описания. Для некоторых локалей отдельные константы могут быть не определены.

Таблица. Константы nl_langinfo

КонстантаОписание
Константы в категории LC_TIME
ABDAY_(1-7)Сокращенное название n-го дня недели.
DAY_(1-7)Полное название n-го дня недели (DAY_1 соответствует воскресенью).
ABMON_(1-12)Сокращенное название n-го месяца.
MON_(1-12)Полное название n-го месяца.
AM_STRОбозначение «до полудня».
PM_STRОбозначение «после полудня».
D_T_FMTСтрока, которую можно использовать в качестве формата с функцией strftime() для вывода даты и времени.
D_FMTСтрока, которую можно использовать в качестве формата с функцией strftime() для вывода даты.
T_FMTСтрока, которую можно использовать в качестве формата с функцией strftime() для вывода времени.
T_FMT_AMPMСтрока, которую можно использовать в качестве формата с функцией strftime() для вывода времени в 12-часовом формате.
ERAЭра
ERA_YEARГод в формате с эрой
ERA_D_T_FMTДата и время в формате с эрой (Строка, которую можно использовать в качестве формата с функцией strftime()).
ERA_D_FMTДата в формате с эрой (Строка, которую можно использовать в качестве формата с функцией strftime()).
ERA_T_FMTВремя в формате с эрой (Строка, которую можно использовать в качестве формата с функцией strftime()).
Константы в категории LC_MONETARY
INT_CURR_SYMBOLМеждународное обозначение валюты.
CURRENCY_SYMBOLНациональное обозначение валюты.
CRNCYSTRАналог CURRENCY_SYMBOL.
MON_DECIMAL_POINTСимвол десятичной точки.
MON_THOUSANDS_SEPРазделитель тысяч (групп из 3 цифр).
MON_GROUPINGАналогичен элементу ‘grouping’.
POSITIVE_SIGNЗнак для положительных чисел.
NEGATIVE_SIGNЗнак для отрицательных чисел.
INT_FRAC_DIGITSКоличество знаков после запятой (международный формат).
FRAC_DIGITSКоличество знаков после запятой (национальный формат).
P_CS_PRECEDESВозвращает 1, если CURRENCY_SYMBOL записывется перед положительным значением.
P_SEP_BY_SPACEВозвращает 1, если CURRENCY_SYMBOL отделяется от положительного значения пробелом.
N_CS_PRECEDESВозвращает 1, если CURRENCY_SYMBOL записывется перед отрицательным значением.
N_SEP_BY_SPACEВозвращает 1, если CURRENCY_SYMBOL отделяется от отрицательного значения пробелом.
P_SIGN_POSNВозвращает 0 если число и обозначение валюты заключаются в скобки
Возвращает 1 если знак записывается перед числом и обозначением валюты
Возвращает 2 если знак записывается после числа и обозначения валюты
Возвращает 3 если знак записывается перед обозначением валюты
Возвращает 4 если знак записывается после обозначения валюты

N_SIGN_POSN
Константы в категории LC_NUMERIC
DECIMAL_POINTСимвол десятичной точки.
RADIXCHARАналогично DECIMAL_POINT.
THOUSANDS_SEPРазделитель тысяч (групп из 3 цифр).
THOUSEPАналогично THOUSANDS_SEP.
GROUPING
Константы в категории LC_MESSAGES
YESEXPRРегулярное выражение, при совпадении с которым строка рассматривается как ответ ‘да’.
NOEXPRРегулярное выражение, при совпадении с которым строка рассматривается как ответ ‘нет’.
YESSTRСлово ‘да’.
NOSTRСлово ‘нет’.
Константы в категории LC_CTYPE
CODESETВозвращает строку с именем текущей кодировки.

Замечание: Для Windows-платформ эта функция не реализована

Локали и кодировки

Введение

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

Работа с локалями в PHP

Работа с локалями в PHP выглядит одинаково и в UNIX, и в Windows, и в любой другой платформе. Для установки значений локали служит всего одна функция setlocale() . Чтобы выставить локаль, нужно передать функции первым аргументом категорию, на которую эта локаль распространяется, последующими список возможных локалей. Результатом будет название первой подходящей локали, которая и была установлена.

Локали в Windows

Для того, чтобы узнать, какие локали доступны в Windows, нужно зайти в панель управления, «Язык и региональные стандарты».

На вкладке «Дополнительно», в разделе «Кодовые страницы таблиц преобразования» показан список всех возможных локалей для Windows, которые можно использовать в PHP.

Кодовые страницы, которые отмечены в списке, из PHP могут быть использованы по их номеру.

В общем случае, использование выглядит по следующей схеме: Язык_Регион.Номер_кодовой_страницы

Для России это может выглядеть как Russian_Russia.1251 (cp1251) или Russian_Russia.20866 (KOI8-R).

Для Украины — Ukrainian_Ukraine.1251 (cp1251).

Вместо длинных названий можно использовать сокращённые russian , american , ukrainian и так далее. При этом кодовая страница выставится с учётом региональных настроек, для России и Украины — 1251, для Америки — 1252.

Единственная кодировка, с которой у меня возникли проблемы, как ни странно, оказалась UTF-8. При попытке выставить эту кодировку, выставляются все категории локалей, кроме основной. Вывод локализованных сообщений при этом идёт в cp1251.

Пока это можно списать на внутренний механизм PHP работы со строками. С шестой версии PHP вся обработка строк должна будет вестись в UTF-8, но до тех пор надо просто знать об этом и делать поправку.

Ещё одной странностью при работе с локалями в PHP на Windows является неправильная работа с категориями локалей. Так, например, я выставляю локаль на функции времени KOI8-R, setlocale(LC_TIME, ‘Russian_Russia.20866’) , но почему-то выставляется cp1251 на все категории. Суть проблемы я так и не понял, возможно, это просто баг (проверялось на PHP 5.2.3), а возможно, что внутренний механизм Windows просто не позволяет этого делать. Хотя по мне, так это чистой воды баг.

В общем-то, на этом можно и закончить разговор о локалях на Windows. Главное, запомнить, что локали, которые портированы из UNIX, под WIndows работают только для «галочки». Шаг влево, шаг вправо и результат будет непредсказуемым. Безопасно можно использовать только cp1251 (windows-1251) и KOI8-R, и только для LC_ALL .

Локали в UNIX

Выше я описал работу с локалями в Windows, теперь можно заострить внимание на UNIX-like системах. Для простоты, я буду их называть UNIX, а подразумевать FreeBSD :). В контексте данной статьи это не особо важно.

Итак, дистрибутивы UNIX поставляются в одном виде для всех, и работа рассчитана на многопользовательский режим, поэтому о правильной настройке локали должен заботиться сам пользователь, например:

Так может выглядеть работа системной команды locale , которая выводит текущие настройки локали для пользователя. А так, обычно, выглядят настройки локали для пользователя, под которым работает PHP:

Функция ucwords() должна была сделать заглавными первые буквы всех слов. А перед этим strtolower() должна была предварительно все заглавные буквы сделать строчными. Но ничего не произошло. Так же не будет работать следующий код:

Хотя w является множеством знаков, из которых может состоять слово (алфавит, цифры и _), регулярное выражение не срабатывает. Причина как раз в том, что, работая с cp1251, мы не сказали об этом php. Чтобы исправить положение, достаточно воспользоваться функцией setlocale() и указать правильную локаль, например, так:

Здесь первый аргумент — это категория, на которую будет распространяться локаль (константа LC_*), второй — название локали. Начиная с версии 4.3.0 можно указывать несколько имён локалей в виде массива или в качестве дополнительных аргументов. После вызова функция установит первую подходящую локаль и вернёт её имя:

С помощью команды grep я отобрал локали, которые поддерживают русский язык. Любую из них можно использовать, однако следует понимать, что данные должны быть в кодировке, на которую рассчитана локаль. Если же это правило не будет соблюдено, то результат может оказаться весьма неожиданным:

Если учесть, что koi8-r достаточно популярная кодировка для UNIX-севреров, а windows-1251 для русскоязычных сайтов, то подобное «необычное» поведение не такая уж и редкость. Когда-то я и сам столкнулся с этой проблемой при портировании проекта на реальный хостинг.

После установки правильной локали все примеры, которые не работали выше, будут работать как нужно!

По-русски заговорит и функция strftime(), которая корректно работает с локалями, а также и всё остальное, что зависит от локали.

Кодировки в MySQL

Напомню, что возможность задавать кодировки появилась только в MySQL 4.1.11 и выше.

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

Первое, чему необходимо научиться, смотреть текущие настройки соединения с mysql:

Критичными для пользователя являются character_set_client и character_set_results, которые отвечают за кодировку, в которой данные поступают в базу, и кодировку, в которой данные поступают из базы к пользователю. Если эти две кодировки отличаются от той, в которой работает клиент, в нашем случае php-скрипты, то неминуемо будут «странности», например, при сортировке выборки или внесении данных в базу.

Второе, что необходимо знать, как правильно сообщить mysql о кодировках. Самый простой и правильный способ, это использовать запрос set names:

После этого три переменные character_set_client, character_set_connection и character_set_results примут значение cp1251. Это будет означать — клиент работает в кодировке windows-1251 (cp1251).

Помимо этого можно устанавливать непосредственно серверные переменные:

Теперь данные поступают и извлекаются в разных кодировках.

Список доступных кодировок можно просмотреть так:

И третье, что необходимо знать, — правила создания таблиц для хранения данных в нужной кодировке. К слову, данные можно хранить в любой кодировке, а работать с ними в кодировке клиента. Однако, важно понимать, что кодировки носят национальный характер и должны соответствовать вносимым данным. Иначе будут потери. Для русского языка есть три национальных кодировки koi8r, cp866, cp1251, которые могут конвертироваться друг в друга без потерь. Также можно использовать интернациональную кодировку UTF8.

Кодировку можно выставить на базу данных, таблицу и поле таблицы. Так, например, можно создать базу данных в кодировке koi8r:

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

Следующим шагом я создам таблицу в cp1251 и одним полем в utf8:

После того, как таблица создана с нужными параметрами кодировки, mysql автоматически начинает переводить данные при внесении и выборке.

Данные хранятся в разном виде, но поступают к пользователю именно так, как надо!

Подробнее с кодировками и проблемами их использования можно ознакомиться на http://dev.mysql.com/doc/refman/5.1/en/charset.html.

Кодировка HTML-страниц

Объявить кодировку html-страницы можно двумя способами: через заголовки и мета-тег в самой странице. Мета-тег используется только в статичных страницах.

Я не буду его разбирать, это проблемы html. Во всех остальных случаях предпочтительней использовать HTTP-заголовок Content-Type.

PHP позволяет работать с HTTP-заголовками посредством функции header():

Но браузер отобразит страницу корректно только в том случае, когда php-файлы сами были созданы в кодировке cp1251. Также нужно понимать, что заголовки должны быть отправлены до любого вывода на экран.

При необходимости перекодировать страницы «на лету», достаточно воспользоваться буферизацией и iconv:

Надпись «Привет, мир!» будет выведена в юникоде, при этом браузер получит информацию о кодировке через заголовки и правильно отобразит страницу. Но важно понимать, что внутри скрипта и при соединении с базой данных надо использовать windows-1251 (cp1251), поскольку страница должна быть сформирована в одной кодировке.

Важно помнить, что функции iconv доступны не всегда, и проверка на доступность этих функций не будет лишней.

Заключение

Для безопасной разработки русскоязычных веб-проектов необходимо включать в файл с общими настройками следующие команды:

Как ни странно, но эти три строчки кода значительно повышают портируемость веб-проектов.

© 2020 Антон Прибора. При копировании материалов с сайта, пожалуйста, указывайте ссылку на источник.

setlocale

(PHP 4, PHP 5, PHP 7)

setlocale — Устанавливает настройки локали

Описание

Устанавливает настройки локали.

Информация о локали модифицируется во всем процессе, а не по каждому потоку отдельно. Если вы используете PHP на многопоточном сервере, таком как IIS, HHVM или Apache под Windows, вы можете обнаружить неожиданные изменения в настройках локали во время выполнения скриптов, никогда и не вызывавших setlocale() . Это происходит из-за того, что другие скрипты, запущенные в параллельных потоках данного процесса, в то же самое время поменяли настройки локали для всего процесса с помощью setlocale() .

Список параметров

Параметр category — это именованная константа, определяющая категорию функций, на которые будет влиять установка локали:

  • LC_ALL — все нижеперечисленное
  • LC_COLLATE — функции сравнения строк, см. strcoll()
  • LC_CTYPE — функции преобразования и классификации строк, например strtoupper()
  • LC_MONETARY — для функции localeconv()
  • LC_NUMERIC — задает символ десятичного разделения (см. также localeconv() )
  • LC_TIME — форматирование даты/времени функцией strftime()
  • LC_MESSAGES — для системных сообщений (доступна, если PHP был скомпилирован с поддержкой libintl)

Если в качестве locale передана пустая строка «» или NULL , имена локалей будут взяты из одноименных переменных окружения или переменной с именем «LANG».

Если в качестве locale передан «0», локаль изменена не будет, а будет возвращено текущее значение.

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

(Необязательные аргументы в виде строк или массивов для установки настроек локали до первой успешной попытки.)

На Windows setlocale(LC_ALL, ») устанавливает имена локалей из системных региональных/языковых настроек (доступных через Панель Управления).

Возвращаемые значения

Возвращает имя вновь установленной локали или FALSE , если система не поддерживает установку локали, указанная локаль не существует или передано недопустимое имя категории.

Недопустимое имя категории также вызывает предупреждение. Имена локалей и категорий описаны в » RFC 1766 и » ISO 639. Разные системы имеют различные схемы именования локалей.

Возвращаемое функцией setlocale() значение зависит от системы, на которой запущен PHP. Она возвращает точно то же значение, что и системная функция setlocale.

Список изменений

ВерсияОписание
7.0.0Удалена поддержка для параметра category , передаваемого как строка. С текущей версии можно пользоваться только константами LC_*.
5.3.0Эта функция в настоящее время бросает уведомления E_DEPRECATED , если строка передается в параметре category вместо одной из констант LC_*.

Примеры

Пример #1 Примеры использования setlocale()

/* Установка голландской локали */
setlocale ( LC_ALL , ‘nl_NL’ );

/* выводит: vrijdag 22 december 1978 */
echo strftime ( «%A %e %B %Y» , mktime ( 0 , 0 , 0 , 12 , 22 , 1978 ));

/* попытка использовать различные локали для немецкого языка */
$loc_de = setlocale ( LC_ALL , ‘de_DE@euro’ , ‘de_DE’ , ‘de’ , ‘ge’ );
echo «На этой системе немецкая локаль имеет имя ‘ $loc_de ‘» ;
?>

Пример #2 Примеры использования setlocale() в Windows

/* Установка голландской локали */
setlocale ( LC_ALL , ‘nld_nld’ );

/* выводит: vrijdag 22 december 1978 */
echo strftime ( «%A %d %B %Y» , mktime ( 0 , 0 , 0 , 12 , 22 , 1978 ));

/* попытка использовать различные локали для немецкого языка */
$loc_de = setlocale ( LC_ALL , ‘de_DE@euro’ , ‘de_DE’ , ‘deu_deu’ );
echo «Предпочитаемая немецкая локаль на этой системе: ‘ $loc_de ‘» ;
?>

Примечания

Пользователи Windows найдут полезной информацию о значениях locale на сайте Microsoft MSDN . Поддерживаемые языки перечислены в » документации по языковым строкам, а значения стран/регионов в » документации по строкам стран/регионов.

Читать еще:  Php datetime compare
Ссылка на основную публикацию
Adblock
detector