регулярные выражения и locale

Baranov_Dron

Новичок
регулярные выражения и locale

Я жутко что-то пристал к регуляркам. Практически мне не нужно. Просто интересно.
Я работаю только с cp1251.
Накалякал следующий пример кода
PHP:
<?
$bykvy = array(
"А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й",
"К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф",
"Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я",
"а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й",
"к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф",
"х", "ц", "ч", "ш", "щ", "ъ", "ы", "ь", "э", "ю", "я"
);
$locales = array("ru_RU.CP1251",
                 "ru_RU.cp1251",
                 "Russian_Russia.1251",
                 "ru_RU",
                 "ru");
foreach ($locales as $locale)
{
    $rr = setlocale(LC_CTYPE, $locale);
    echo "<p>Локаль: ".$locale." "; var_dump($rr);
    if($rr)
    {

        $err = "";
        echo "Найдены буквы:<p>";
	    foreach($bykvy as $b)
	    {
	        if(preg_match("!^[[:alpha:]]{1}$!", $b, $res))
	        {
	            echo $b." ";
	        }
	        else
	        {
	            $err[] = $b;
	        }
	    }
	    if($err)
	    {
	    	echo "<p>Не найдены буквы:<p>";
	        foreach($err as $b)
	        {
	            echo $b." ";
	        }
	        echo "<p>";
	    }
	}
	else
	{
	    echo "не установлена:(<p>";
	}
}
?>
На домашнем компьютере(windows, php5.2.5) выполнился как:

Локаль: ru_RU.CP1251 bool(false) не установлена:(

Локаль: ru_RU.cp1251 bool(false) не установлена:(

Локаль: Russian_Russia.1251 string(19) "Russian_Russia.1251" Найдены буквы:

А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я

Локаль: ru_RU bool(false) не установлена:(

Локаль: ru bool(false) не установлена:(
На линукс хостинге(php 5.2.6)
Локаль: ru_RU.CP1251 bool(false) не установлена:(

Локаль: ru_RU.cp1251 bool(false) не установлена:(

Локаль: Russian_Russia.1251 bool(false) не установлена:(

Локаль: ru_RU string(5) "ru_RU" Найдены буквы:

А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ё ж з и й к л м н о п с т у ф х ц ч ш щ ъ ы ь ю я

Не найдены буквы:

р э

Локаль: ru bool(false) не установлена:(
Решил изменить регулярное выражение на !^[а-яА-Я]{1}$!
Результаты:
Домашний:
Локаль: ru_RU.CP1251 bool(false) не установлена:(

Локаль: ru_RU.cp1251 bool(false) не установлена:(

Локаль: Russian_Russia.1251 string(19) "Russian_Russia.1251" Найдены буквы:

А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я

Не найдены буквы:

Ё ё

Локаль: ru_RU bool(false) не установлена:(

Локаль: ru bool(false) не установлена:(
хостинг: тот же результат!!!
Вопрос в том, как объяснить происходящее?
P.S. использовал поиск
на этом форуме запросы: "locale регулярные выражения", "ошибка alpha" + гугл
alpha и буква р site:http://phpclub.ru/
[а-я] и буква ё site:http://phpclub.ru/
чёрт боюсь опять плохо искал((( если так, то укажите пожалуйста по какому запросу искать!
 

fixxxer

К.О.
Партнер клуба
Локаль: ru_RU.CP1251 bool(false) не установлена:(

Локаль: ru_RU.cp1251 bool(false) не установлена:(

Локаль: Russian_Russia.1251 bool(false) не установлена:(

Локаль: ru_RU string(5) "ru_RU" Найдены буквы:
ну и с чего ты взял, что ru_RU это 1251? это вполне может быть koi8 или utf8 ;)
 

Baranov_Dron

Новичок
тогда встаёт два вопроса:
1) как узнать какая в ru_RU используется кодировка?
2) а почему остальные буквы ищутся preg_match`ем?
Также не понятен второй тест, получается буквам а-я не соответствует буква ё, почему?
 

fixxxer

К.О.
Партнер клуба
1) надо попросить установить на хостинге 1251, а если это российский хостинг - бежать оттуда
2) потому что а-я это диапазон, в который ёЁ не входят - посмотри таблицу 1251
 

Baranov_Dron

Новичок
спасибо за ответ!
остаётся только загадка, почему же тогда мой второй тест, кроме букв "р э" остальные буквы нашёл? получается в той локале RU_ru стоит кодировка в которой кодам найденных букв соотвествуют другие буквы например?
и как можно средствами php проверить какая кодировка соответсвует данной локали?
 

fixxxer

К.О.
Партнер клуба
ну кодировка это же просто наборы соответствий кодов, наверняка большей частью пересекаются.
сравни таблицы 1251 и кои8 например.

а проверять ничего не надо, если на юникс системе нет локали ru_RU.CP1251 или ru_RU.cp1251 значит 1251 не установлена в 99.9999% случаев
 
Сверху