Strtolower и кирилица

Статус
В этой теме нельзя размещать новые ответы.

alexblade

Новичок
Strtolower и кирилица вообще работают вместе? А то у меня только с латиницей получается
 

alexblade

Новичок
Gremboloid
внутри страницы
<html lang="ru">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
echo setlocale(LC_CTYPE, ''); дал Russian_Russia.1251
когда использую верхний эхо то strtolower($caps[0]) возращает ����� абракадабру
 

alexblade

Новичок
после удаления верхнего эхо. по прежнему показывается абракадабра о_О
даже mb_strtolower($caps[0]) возращает �����

как обратно исправить ? чтоб strtolower($caps[0]) возращал нормальную кирилицу пусть и без опускания регистра
 

alexblade

Новичок
я добавил в код поперемено следущие строки для посмотреть /изменить локаль
echo setlocale(LC_CTYPE, '')
setlocale(LC_CTYPE, 'ru')
setlocale(LC_CTYPE, 'rus')
setlocale(LC_CTYPE, 'ru.UTF-8')
setlocale(LC_CTYPE, 'en')

каждый раз strtolower($caps[0]) возращает ����� абракадабру

после я удалил сетлокаль но strtolower($caps[0]) всеравно возращает ����� абракадабру
 

Активист

Активист
Команда форума
Для utf8 (двухбайтовых и более кодировок) используется mb_strtolower, для байтовых кодировок - strtolower

Ставить локаль надо так:
cp1251:
PHP:
<?php
// Список локалей, которые будут устанавливаться по порядкку
$locales   = array(	
				   	"Russian_Russia.1251",
					"ru_RU.CP1251",
					"ru_RU.cp1251",
					"ru_RU",
					"RU",					
					"rus_RUS.1251"
					);

$setFlag = false;

foreach ($locales as $localeName) {
	if ($setFlag === false) {
		// Выполняем установку локали
		setlocale(LC_ALL, $localeName);
	}
	// Провреряем, установлена ли локаль
	if ($setFlag === false && strtolower("qwertyёЁАБГДЯQWERTYZ") === "qwertyёёабгдяqwertyz") {
		// Локаль установлена корректно
		$setFlag = true;
		break;
	}
}

if ($setFlag !== true) {
	// Ошибка, локаль не установлена
	echo "<p>Fatal error: PHP can't setup locale to CP1251 character set (ru_RU.CP1251 for *nix OS, Russian_Russia.1251 for Windows OS). This locale is missing or operation system not supported it.</p><ul><li>To fix this error on Linux OS edit file /etc/locale.gen and add line <b>ru_RU.CP1251 CP1251</b> (or uncomment this line) and run <b>locale-gen</b> (root privileges required);</li><li>For Debian based Linux (Debian, Ubuntu etc...) use  <b>dpkg-reconfigure locales</b> command for configuring locales (root privileges required);</li><li>For FreeBSD use <b>locale-gen ru_RU.CP1251</b> (root privileges required);</li><li>For Windows OS install locale from Control pannel -> Languages and Regions section (administrator privileges required).</li></ul><p>Please contact with server administrator and notify him about this error</p>";
	exit();
}

setlocale(LC_NUMERIC, "C"); // for float numeric
?>
Для utf8:
PHP:
<?php
// Set locale in UTF-8 Not supported in Windows
if (PHP_OS == "WINNT") {
	return 0;
}

// Список локалей, которые будут устанавливаться по порядкку
$locales   = array(	
					"ru_RU.UTF8",
					"Russian_Russia.65001",
					"Russian_Russia.UTF8",
					"ru_RU.UTF-8"
					);

$setFlag = false;

foreach ($locales as $localeName) {
	
	if ($setFlag === false) {
		// Выполняем установку локали
		setlocale(LC_ALL, $localeName);
	}
	
	// Провреряем, установлена ли локаль
	if ($setFlag === false && 
			//(mb_strtolower("qwertyёЁАБГДЯQWERTYZ") === "qwertyёёабгдяqwertyz")
			//||
			preg_match("/^[а-яЁё]+$/ui", strftime("%a"))
			) {
		// Локаль установлена корректно
		$setFlag = true;
		break;
	}
}

if ($setFlag !== true) {
	// Ошибка, локаль не установлена
	echo "<p>Fatal error: PHP can't setup locale to Russian UTF8 character set (ru_RU.UTF8 for *nix OS, Russian_Russia.65001 for Windows OS). This locale is missing or operation system not supported it.</p><ul><li>To fix this error on Linux OS edit file /etc/locale.gen and add line <b>ru_RU.UTF8 UTF8</b> (or uncomment this line) and run <b>locale-gen</b> (root privileges required);</li><li>For Debian based Linux (Debian, Ubuntu etc...) use  <b>dpkg-reconfigure locales</b> command for configuring locales (root privileges required);</li><li>For FreeBSD use <b>locale-gen ru_RU.UTF8</b> (root privileges required);</li><li>For Windows OS install locale from Control pannel -> Languages and Regions section (administrator privileges required).</li></ul><p>Please contact with server administrator and notify him about this error</p>";
	exit();
}

setlocale(LC_NUMERIC, "C"); // for float numeric
ini_set("mbstring.internal_encoding", "utf8");

?>
 

Gremboloid

инженера Гр...
alexblade, для работы с UTF-8 ссылку дал c0dex. А лучше прочти весть раздел Многобайтные строки

для использования strtolower с UTF надо правильно прописать настройку в php.ini mbstring.func_overload
для использования mb_strtolower без второго параметра, пропиши в настройках нужный тебе mbstring.internal_encoding = UTF-8
 

Gremboloid

инженера Гр...
Активист, пример для utf8 в Винде начиная с семерки выдаст PHP can't setup locale to Russian UTF8 character set
 

Активист

Активист
Команда форума
Установка локали, для utf8 нужно лишь для того, что бы отрабатывали функции корректно (money formats, dates), т.е. русская локализация типичных функций. Функции для работы с мультибайтными строками (mb strings) работают корректно без устаровки setlocale.
 

alexblade

Новичок
Как я написал выше

даже mb_strtolower($caps[0]) возращает �����

Но с вашими новыми примерами попробую исправить вечером
 

alexblade

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

до рестарта я смотрел что могла поменять setlocale() но так и не нашол что она меняет, подскажите пожалуйста какой именно параметр в настройках (в php.ini или где еще) меняет setlocale() ?
 

Gremboloid

инженера Гр...
Еще раз. setlocale нужно для работы strtolower с однобайтными кодировками.
Используется кодировка UTF8, отсюда локаль можно не трогать, а прописать нужную настройку mbstring.internal_encoding или использовать mb_strtolower с двумя параметрами
У тебя в настройках mbstring.internal_encoding чему равно?
 

alexblade

Новичок
offtop:зачем сразу упоминать про фикалии при указании своего более простого кода

вначале что было сделано а потом вопросы. и так

поставил mb_strtolower($title,'UTF-8') и все прекрасно сработало, поставил второй параметр. первоночально подумал это нужно если преобразуемая строка кодировки отличной от "на странице", ведь у меня страница(файл) сохранен как утф .
1. если не указан ни второй параметр ни mbstring.internal_encoding а mbstring.language=neutral, за какое значение должна приниматься внутреняя кодировка ?
mb_internal_encoding() вернул ISO-8859-1 почему?

теперь вопрос, только прочтите пожалуйстав внимательно.
2. как я понял действие setlocale не временое (пока она в памяти) а постояное потому что даже после удаления её из кода эфект остался (помог только рестарт сервисов), что а главное где она меняет?

3. на что могла повлиять setlocale (кроме этого просто ничего не делалось с кодом или php.ini) если
-до установки локали mb_strtolower($caps[0]) возращал "Новости" (setlocale нету в коде)
-после установки локали и потом удаления её из кода, mb_strtolower($caps[0]) возращает теперь мусор ����� (хотя setlocale нету в коде)
 

Активист

Активист
Команда форума
offtop:зачем сразу упоминать про фикалии при указании своего более простого кода

вначале что было сделано а потом вопросы. и так

поставил mb_strtolower($title,'UTF-8') и все прекрасно сработало, поставил второй параметр. первоночально подумал это нужно если преобразуемая строка кодировки отличной от "на странице", ведь у меня страница(файл) сохранен как утф .
1. если не указан ни второй параметр ни mbstring.internal_encoding а mbstring.language=neutral, за какое значение должна приниматься внутреняя кодировка ?
mb_internal_encoding() вернул ISO-8859-1 почему?

теперь вопрос, только прочтите пожалуйстав внимательно.
2. как я понял действие setlocale не временое (пока она в памяти) а постояное потому что даже после удаления её из кода эфект остался (помог только рестарт сервисов), что а главное где она меняет?

3. на что могла повлиять setlocale (кроме этого просто ничего не делалось с кодом или php.ini) если
-до установки локали mb_strtolower($caps[0]) возращал "Новости" (setlocale нету в коде)
-после установки локали и потом удаления её из кода, mb_strtolower($caps[0]) возращает теперь мусор ����� (хотя setlocale нету в коде)
1. mb_strtolower указывайте кодировку или укажите ее через ini_set;
2. для трейдовской версии апаче и пхп действия локали сохраняется в пределах одного вокера.
 

Активист

Активист
Команда форума
Омг зачем весь этот говнокод?

$locales = array(...);
if (false === setlocale(LC_ALL, $locales)) {
// failed to set locale
}
Кривых серверов за свое время встречал массу, где как бэ и локаль устанавливается, но функции НЕ работают корректно.
 

alexblade

Новичок
спасибо Активист.

что такое вокер?

может это мне поможет понять почему после рестарта апачи+пхп mb_strtolower($caps[0]) всеравно возращает мустор. хотя до первой "игры" с локале оно возращало текст "Новости" пусть не лоуркейс но и не мусор
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху