кодировки и str_replace()

j.KS
На сайте с 03.11.2006
Offline
107
1417

простой скрипт транслитерации:


$letters=array(
"а"=>"a",
"б"=>"b",
"в"=>"v",
.....
"я"=>"ya",
" "=>"_", );
while ($element = each($letters))
{ $eng_button=str_replace($element[0], $element[1], strtolower($button)); }

При обработке заданной вручную в файле переменной обрабатывает ее нормально.

При вводе $button через форму обрабатывает только символ пробела.

Массив $letters пробовал загружать из файла и из БД (кодировка win-1251).

В хтаксесс прописано AddDefaultCharset windows-1251

В хеде прописано <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

Работаю в HomeSite, он все сохраняет в ANSI.

При этом


while ($element = each($letters))
{ echo $element[0].' - '.$element[1].'<br>'; }

все выводит корректно.

Где закрался косяк?

Куплю сайт(ы) с доходом (1-3)k$/мес. с контекста (/ru/forum/582890)
Дмитрий
На сайте с 23.08.2006
Offline
222
#1

1. Тут лучше применить функцию strtr.

2. Сделайте echo данных из формы, и подберите кодировку, в которой приходят данные. Потом iconv'ом переводите все данные из вне в кодировку страницы. Вообще лучше все в UTF-8, решаются многие проблемы

Разрабатываю и автоматизирую на php http://jonnyb.ru/
tommy-gung
На сайте с 22.11.2006
Offline
304
#2

возможно локаль нужно установить

Здесь не могла быть ваша реклама
Pro PHP
На сайте с 27.05.2007
Offline
21
#3

1. установи локаль setlocale();

2. сохрани файл скрипта в кодировке CP-1251 (она же Windows-1251);

3. воспользуйся советом JonnyB и используй функцию strtr.

Радуйся работающему скрипту!

Для PHP программистов: Templum - шаблонизатор для php (http://templum.googlecode.com) (замена Smarty), рассылка на Subscribe.ru (http://subscribe.ru/catalog/inet.webbuild.php5pro).
Progr@mmer\.
На сайте с 14.10.2007
Offline
44
#4
j.KS:
$letters=array(
"а"=>"a",
"б"=>"b",
"в"=>"v",
.....
"я"=>"ya",
" "=>"_", );
while ($element = each($letters))
{ $eng_button=str_replace($element[0], $element[1], strtolower($button)); }

Чистой воды мазахизм....

1. В str_replace() в первом и втором аргументе можно применять массивы. Т.е.:


$string = 'абв';

$array1 = array(
'а',
'б',
'в');

$array2 = array(
'a',
'b',
'v');

$result = str_replace($array1, $array2, $string);

2. Вот вам функция транслитерации:


function totranslit($var)
{
$NpjLettersFrom = "абвгдезиклмнопрстуфцы";
$NpjLettersTo = "abvgdeziklmnoprstufcy";
$NpjBiLetters = array(
"й" => "jj", "ё" => "jo", "ж" => "zh", "х" => "kh", "ч" => "ch",
"ш" => "sh", "щ" => "shh", "э" => "je", "ю" => "ju", "я" => "ja",
"ъ" => "", "ь" => "",
);

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

$var = trim(strip_tags($var));
$var = preg_replace( "/\s+/ms", "_", $var );
$var = strtr( $var, $NpjCaps, $NpjSmall );
$var = strtr( $var, $NpjLettersFrom, $NpjLettersTo );
$var = strtr( $var, $NpjBiLetters );

$var = preg_replace("/[^a-z0-9_]+/mi", "", $var);
$var = strtolower ( $var );

return $var;
}
Вашей девушке не хватает романтики? Черпните её на сайте «Я Люблю Романтику» (http://iloveromantics.ru/). Романтический форум (http://forum.iloveromantics.ru/) для отдыха от нудной работы.
Pro PHP
На сайте с 27.05.2007
Offline
21
#5

Progr@mmer., у тебя отличный ник (знак "собачка" стоит там где надо). Молодец что не поленился написать развернутый ответ!

Pro PHP добавил 10.05.2008 в 14:38

Кстати, для справки. В PHP есть функция транслитерации, которая уже встроена. Я на нее наталкивался как-то недавно. Можете поискать ее в рубрике справки "Работа со строками" ("Строковые функции").

Вот ссылки для пищи мозга:

- http://pecl.php.net/package/translit

- http://sitemaker.ru/develop/php/translit/

j.KS
На сайте с 03.11.2006
Offline
107
#6

Всем спасибо за участие.

strtr и локаль проблему не решили.

Помог готовый вариант от Progr@mmer\., ему отдельное спасибо.


Кстати, для справки. В PHP есть функция транслитерации, которая уже встроена

Встроена для всех языков? Хз хз...

A0
На сайте с 22.09.2007
Offline
70
#7

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

programmer использовать три вызова strtr ради транлитерации строки - по моему это издевательство над серверов... не стану говорить, что в целом функция плохая (потому что сейчас нет времени писать сюда свой вариант), но как минимум 3 вызова можно было бы в 1 превратить...

Дмитрий
На сайте с 23.08.2006
Offline
222
#8

Да, есть на большинстве платформах, iconv называется (с //TRANSLIT).

Progr@mmer\.
На сайте с 14.10.2007
Offline
44
#9

an0nym, это код из DLE. Там ни строчки моего нет %)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий