Проблема с кодировкой и перебором символов в php

hbreaker

Новичок
Проблема с кодировкой и перебором символов в php

Значит у меня в БД наряду с нормальными строками есть такая фигня

АЗС (автозаправочная станция

т.е. символы почему-то кодировались в юникод перед записью в БД.
мне их надо перевести в нормальные кирилические, но писать в ручную таблицу для перекодировки довольно геморно. я заметил что буква 'А' = '&#1040', 'Б' = '&#1041'

т.е. можно сделать скриптик который составит нужную мне таблицу, но как в php перебрать символы от 'А' до 'Я'?
что-то вроде как в C++
for (char i='А'; i<='Я'; i++)

можно ли что-то подобное сделать в php?

-~{}~ 14.04.06 15:35:

блин.. это выглядит как "АЗС (автозаправочная станция"

&# 1040;&# 1047;&# 1057; (&# 1072;&# 1074;
 

McSimm

Новичок
unicode и utf8 это не одно и то же

-~{}~ 14.04.06 17:35:

Вопрос. Данные хранятся именно в таком виде, как приведено?
Т.е. в виде строки с амперсандами и решетками ?

Если да, то это результат работы htmlentities()
и обратное преобразование делается приблизительно так
html_entity_decode($a, ENT_NOQUOTES, 'cp1251');
( с нужными параметрами, конечно )
 

hbreaker

Новичок
написал :)

PHP:
<?

echo "<pre>";
$c=1040;
for ($i=ord('А'); $i<=ord('Я'); $i++)
{
	echo "\$s = str_replace('&#$c;','".chr($i)."',\$s);\n";
	$c=$c+1;
}
for ($i=ord('а'); $i<=ord('я'); $i++)
{
	echo "\$s = str_replace('&#$c;','".chr($i)."',\$s);\n";
	$c=$c+1;
}

?>
-~{}~ 14.04.06 16:55:

McSimm
спасибо
а я мучался, всё было намного проще

-~{}~ 14.04.06 17:47:

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

PHP:
<?
    require_once './classes/globals.php';
    
$res=$dbobject->GetAll("SELECT * FROM  buy_sell");

foreach ($res as $i => $d)
{
	foreach ($d as $ii => $dd)
	{
		$res[$i][$ii]=html_entity_decode($dd, ENT_NOQUOTES, 'cp1251');
	}
}

function CreateSQL($data)
{
	$sql="UPDATE buy_sell SET ";
	foreach ($data as $i => $d)
	{	
		if ($i=='id') continue;
		if (is_numeric($d))
			$sql.="$i=$d,";
		else
			$sql.="$i='".str_replace("'","''",$d)."',";
	}
	$sql = substr($sql,0,strlen($sql)-1);
	$sql.= " WHERE id=$data[id]";
	return $sql;
}

foreach ($res as $i => $d)
{
	$dbobject->query(CreateSQL($d));
}


?>
 

hbreaker

Новичок
тоесть такой случай уникален?
кстати я не могу понять как могли записаться в БД символы виде строки с амперсандами и решетками вместо нормальных.
может кто знает?
 

Фанат

oncle terrible
Команда форума
я не сказал, что случай уникален.
я сказал, что твой код не пригодится.
этих кодов тут на форуме тыщи.
ты же не нашёл ни одного?
почему ты думаешь, что кто-то твой найдёт?
 

rob72

Новичок
А я бы предложил сделать так:
PHP:
<?php 
//--Это делаем где-нибудь в начале один раз--
$tr=array();
for($i=192;$i<256;$i++){
$tr[(chr($i))]=('&#'.($i+848).';');
}
//-------------------------------------
//--А вот само преобразование--
$str='Это наш текст на кириллице';
echo $html_ob_str=strtr($str,$tr);
//Результат: &#1069;&#1090;&#1086; &#1085;..........
//--А теперь обратно--
echo $str=strtr($str,array_flip($tr));
//Результат: Это наш текст на кириллице
//--
?>
Работает намного быстрее (проверял), да и выглядит получше
 

rob72

Новичок
случайно не оно?
Нет, это лично мое. А пример тот довольно примитивен, Дело в том, что в моем примере лишь раз вызывается ВСТРОЕННАЯ, а значит, компилированная функция strtr, Поэтому быстродействие намного выше, что при обработке больших фрагментов может оказаться немаловажным. В свое время я испытывал многие варианты, в т.ч подобный
http://phpclub.ru/faq/wakka.php?wak...ings2&v=8b6
измеряя время работы.
Лучшего не нашел.
 
Сверху