php конвертиране на string в utf-8

hatre

Active Member
Как да конвертирам този текст в utf-8?
HTML:
&# 1056;&# 1077;&# 1078;&# 1080;&# 1089;&# 1100;&# 1086;&# 1088; -  Режисьор

През браузъра се вижда нормален, но като дам на код, се виждат тези гадории, искам да ги направя нормални, пробвах няколко неща не става. В краен случай, мисля едно по едно да ги заменя със съответстващите им кирилски букви.
Дай на код и потърси в кода думата "Режисьор" няма я.
 
Последно редактирано:
От: Конвертиране на string в utf-8

Пробвай да ги извеждаш с html_entity_decode
 
Последно редактирано:
От: php конвертиране на string в utf-8

php файла трябва да е Encode in UTF-8, А НЕ Encode in UTF-8 without BOM
PHP:
$ASCII = 'Самый мощный ураган'; // &#_1057..;
$UTF8 = preg_replace_callback("/(&#[0-9]+;)/", function($m) { return mb_convert_encoding($m[1], "UTF-8", "HTML-ENTITIES"); }, $ASCII);
echo $len = mb_strlen($UTF8, 'UTF-8'); 	// UTF-8 strlen
echo mb_substr($UTF8,0,$len,'UTF-8'); // UTF-8 substr
 
От: php конвертиране на string в utf-8

Curl се логва в един сайт и извлича и ги дава на dom document. След това го направих с textarea и пост заявка вместо Curl. Когато се правят някакви операции с dom обекта, той прави всичко на ASCII кодове и за това трябваше обработените низове да ги конвертирам. Вече всичко си бачка, само трябва да ги запиша в БД и да си направя едни адним панел, който ще го правя 1 седмица, като знам какъв съм бърз
 
От: php конвертиране на string в utf-8

php файла трябва да е Encode in UTF-8, А НЕ Encode in UTF-8 without BOM
Недавай такива съвети повече! Задължително трябва да ти е without BOM файла.

Как така като работиш с DOM тескта ставал ASCII? Няма такова нещо!
Ако html-а който извличаш няма таг указващ енкодинга то по дефаулт се слага latin1 и точно заради това имаш проблеми. Ако към стринга добавиш "<meta http-equiv="content-type" content="text/html;charset=utf-8" />" ще получиш данните в нормален вид и няма да се налага да опираш до mb_*
 
От: php конвертиране на string в utf-8

Здравей,
може да избегнеш подобни проблеми ако конвертираш html-а още преди да го заредиш с ДомДокумент-а.
Код:
$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
Ако все пак не стане може да се ползва този "трик"
Код:
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $html);
Метата, която оказва енкодинга на ХТМЛ-а може да обърка ДомДокумент-а, затова след конвертирането на входящите данни трябва и тя да се промени на съответният енкодинг, в случая UTF8.
Поздрави,
Константин.
 
От: php конвертиране на string в utf-8

@imagination метата за хтмл-а нищо не обърква :), защото DOM функциалността в PHP работи както с html, така и с xml документи.
Не е нужно да се преобразува utf8 стринг в utf8.
 
От: php конвертиране на string в utf-8

@AMitrev,
подозирам, че си прав, но ако случайно xpat-a започне да се държи странно, върни се и прочети отново този пост :)
 
От: php конвертиране на string в utf-8

@imagination точно за да не се държи странно не преобразуваш нищо. Работиш с оригинала и когато се налага да запишеш взетите данни при теб ги обръщаш в правилният за системата ти енкодинг.
 
От: php конвертиране на string в utf-8

Благодаря, че се включвате, но по това нещо вече хич не ми се говори 2 дена се чудих както става. Не помня всички 100 неща които съм правил,

Кирилицата идва бъгната ставa на ромбчета
PHP:
function login()
{
	$username = '...';
	$password = '.....';
	$url = '....';
	$page_grab = '....';
	$postdata = "username=".$username."&password=".$password;
	$cookie = "C:\wamp\www\test\cookie.txt";
	session_write_close();
	$ch = curl_init(); 
	curl_setopt ($ch, CURLOPT_URL, $url); 
	curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
	curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 5.1; rv:28.0) Gecko/20100101 Firefox/28.0 "); 
	curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
	curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 
	curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie); 
	curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie); 
	curl_setopt( $ch, CURLOPT_COOKIE, $cookie );
	curl_setopt ($ch, CURLOPT_REFERER, $url); 
	curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata); 
	curl_setopt($ch, CURLOPT_VERBOSE, true);
	curl_setopt ($ch, CURLOPT_POST, 1); 
	$result = curl_exec($ch); 
	curl_setopt($ch, CURLOPT_URL, $page_grab);
	$html = curl_exec($ch);
	curl_close($ch);
	return $html;
}


Ако направиш файл кодиран с Encode in UTF-8 without BOM и цъкниш на бутона, после става на ASCII , ако е без BOM си е нормален
PHP:
<form method="post">
	<?php if(isset($_POST["text"]) ) { ?>	
		<textarea name="text" rows="10" cols="100"><?php echo $_POST["text"]; ?></textarea> 
		<?php } else { ?>
		<textarea name="text" rows="10" cols="100"></textarea><?php }?><br/>
		<input type="submit" value="submit" name="submit">
</form>



Без значение как е конвертиран файла - ASCII , utf-8 с или без BOM, "проба" става в ASCII, на странни символи, а в един от случаите, след кирилицата всичко изчезва
PHP:
<?php 
function get_elem_by_class_positon(  $dom_obj , $classname, $position )
{
		$finder = new DomXPath($dom_obj);
		$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
		$number = 0;
		$tmp_dom = new DOMDocument();
		foreach ($nodes as $node) 
		{
			$number = $number +1;
			if( $position == $number ) {  
				$tmp_dom->appendChild($tmp_dom->importNode($node,true));
				break;	
			}
		}
	return $tmp_dom;
}
	$dom = new DOMDocument();	
	$text =  '<meta http-equiv="content-type" content="text/html;charset=utf-8" />' . '<div class="test">проба</div>';
	// или  $text =  '<?xml encoding="UTF-8">' . '<div class="test">проба</div>'; 	
$dom->loadHTML( $text);	
	$dom = get_elem_by_class_positon(  $dom , 'test', 1);	
	?> <textarea><?php echo $dom->saveHTML(); ?></textarea><?php


Това работи, но само така не върши работа
PHP:
<?php
	$dom = new DOMDocument();	
	// <?xml encoding="UTF-8"> с това не става
	$text =  '<meta http-equiv="content-type" content="text/html;charset=utf-8" />' . '<div class="test">проба</div>';
	$dom->loadHTML( $text);	
	?> <textarea><?php echo $dom->saveHTML(); ?></textarea><?php
 
От: php конвертиране на string в utf-8

Пиша малко наизуст, но по мои спомени зависеше от версията на libxml, с която е компилирано php.

Само дето не се сещам SimpleXML или DOMDocument ставаше въпрос, но имах подобни ядове преди време.
 
От: php конвертиране на string в utf-8

Здравей,
първо си оправи кодирането на файловете. Принципно всеки сам си решава, но аз ти препоръчвам да ги направиш UTF8 без БОМ. Другото, което ми прави впечатление, е че преди да изведеш информацията никъде не задаваш какво ще извеждаш и в какъв енкодинг. Примерно:
Код:
<?php
header('content-type: text/html; charsert=UTF-8'); 
$dom = new DOMDocument();    
// <?xml encoding="UTF-8"> с това не става
$text =  '<meta http-equiv="content-type" content="text/html;charset=utf-8" />' . '<div class="test">проба</div>';
$dom->loadHTML( $text);    
?><textarea><?php echo $dom->saveHTML(); ?></textarea>
Поздрави,
Константин.
 

Горе