IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Веб-программирование (http://www.imho.ws/forumdisplay.php?f=29)
-   -   проблема - Regular Expression и русская буква "ч" (http://www.imho.ws/showthread.php?t=52073)

NarcomBAT 24.02.2004 17:58

проблема - Regular Expression и русская буква "ч"
 
имеется текстовой файл(на русском) и такой вот код
PHP код:

$file "C:\\Inetpub\\wwwroot\\members\\data\\2004\\4\\3.txt";
$fd fopen ($file"r");
    
$contents fread ($fdfilesize ($file)); 
    
fclose ($fd);
    print 
$contents."<br>";
    
/* Extract all words matching the regexp from the current line: */
    
preg_match_all("/\b[a-zA-Zа-яА-Я]+\b/",$contents,$words);
    
print_r($words)."<br>"

нужно считать файл в переменныю $content что и происходит
затем надо $contents разбить на массив где каждый элемент массива
это одно слово

ну напрмер файл 3.txt содержит одну строку
"Вечно молодой вечно пьяный"

после выполнения скрипта получаем такой вот массив $word
Array ( [0] => Array ( [0] => Вечно [1] => молодой [2] => вечно [3] => пьяный ) )

но вот что странное я заметил - если слово начиняется с буквы "ч" то она просто пропадает

ну напрмер если файл 3.txt содержит одну строку
"зачем через голову прыгать"

после выполнения скрипта получаем такой вот массив $word
Array ( [0] => Array ( [0] => зачем [1] => ерез [2] => голову [3] => прыгать ) )

т.е. слово "через" превратилось "ерез"

и так со всеми словами которые начинаются на букву "ч"

я не понимаю что происходит
в чем проблема??

RaZEr 24.02.2004 18:59

Скорей всего локаль кривая. Юзай setlocale.

BiГ 24.02.2004 20:50

PHP какой версии ... обнови, в последних версиях этот глюк исправили ...

NarcomBAT 25.02.2004 10:42

RaZEr
например в php-help есть пример

/* Set locale to Dutch */
setlocale (LC_ALL, 'nl_NL');

что-бы сделать set locale to Russian вместо 'nl_NL' нужно поставить 'ru_RU'
или как? можно чуть-чуть по подробней?


BiГ

версия 4.3.2

Добавлено через 6 минут:
RaZEr

проверил если ставить ru_RU ничего не меняется

RaZEr 25.02.2004 10:42

ru_RU.CP1251

NarcomBAT 25.02.2004 11:14

RaZEr
поставил

setlocale (LC_ALL, 'ru');

в это примере заработалаааа
ставлю в реальный скрипт в первую строку не работает никаких изменений
этот preg_match_all находится где-то в середине скрипта
ставлю setlocale прямо перед preg_match_all - РАБОТАЕТ
это тоже странно выходит так что некоторые функции которые вроде как
не дожны менять locale меняют его
но это вроде как уже другая проблема а мой скрипт заработал

Спасибо RaZEr выручил

Добавлено через 10 минут:
RaZEr

нет неработает ru_RU.CP1251

RaZEr 25.02.2004 11:16

Значит не стоит. Узнай какая стоит, если не стоит никакая, нужно поставить.

NarcomBAT 25.02.2004 13:45

RaZEr

HTTP_ACCEPT_LANGUAGE - en-us. ты про это или нет
но ведь всетаки если ставишь setlocale (LC_ALL, 'ru');
в скрипте то работает

зашел в Regional and language Options поменял Regional Options на
Russian соответственно сейчас
HTTP_ACCEPT_LANGUAGE - ru

но все равно ru_RU.CP1251 не работает
и если вообще без setlocale буква "ч" все равно пропадает
хотя HTTP_ACCEPT_LANGUAGE - ru

RaZEr 26.02.2004 02:34

Формат locale:
Код:

lang[_country_region[.code_page]]
Примеры для nix:
Код:

setlocale(LC_ALL,"ru");
setlocale(LC_ALL,"ru_RU");
setlocale(LC_ALL,"ru_RU.CP1251");

Примеры для окон:
Код:

setlocale(LC_ALL,"rus");
setlocale(LC_ALL,"Russian");
setlocale(LC_ALL,"Russian_Russia");
setlocale(LC_ALL,"Russian_Russia.1251");

PS: Сочетания языков, регионов и кодировок для nix разные и те, что есть по умолчанию лежат в /usr/share/locale . Для окон все довольно стандартно, - список языков и регионов есть на MSDN, а кодировки в реестре посмотри если оч. интересно (но 1251 и 1252 есть точно).

NarcomBAT 26.02.2004 21:44

интерсно было, посмотрел в реестре
есть windows-1251 ну что мне с этого
я проверил у меня WindowXP,PHP 4.3.2, IIS
вот setlocale(LC_ALL,"ru") или setlocale(LC_ALL,"rus") работает

а вот на хосте RedHat, PHP 4.2.2 работает
setlocale(LC_ALL,"ru_RU")

вот так


Часовой пояс GMT +4, время: 11:54.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.