özel karakterler ile mücadele (html_entity_decode, iconv, ve daha fazlası)

2 Cevap php

Benim veritabanında saklayabilirsiniz çekirdek utf-8 aşağı çevrilmiş bir karakter demet alma ile mücadele ettik.

PHP iconv birçok karakter başarısız, bu yüzden işe yaramazsa gerçekten bir çözüm değil ki, benim kendi 'çözüm' inşa etmek zorunda oldum, ve pencereler neredeyse tamamen başarısız, yani iconv çoğunlukla sonuçsuz gelişmekte Ben test sunucusu üzerinde 'dev' var gibi. Iconv karakter bir ton özlüyor olarak da, tüm çok yararlı değildir.

İşte benim işlevi yapıyorum ne var olduğunu

function replace_accents($string) { 
  return str_replace( array('à','á','â','ã','ä', 'ç', 'è','é','ê','ë', 'ì','í','î','ï', 'ñ', 'ò','ó','ô','õ','ö', 'ù','ú','û','ü', 'ý','ÿ', 'À','Á','Â','Ã','Ä', 'Ç', 'È','É','Ê','Ë', 'Ì','Í','Î','Ï', 'Ñ', 'Ò','Ó','Ô','Õ','Ö', 'Ù','Ú','Û','Ü', 'Ý'), array('a','a','a','a','a', 'c', 'e','e','e','e', 'i','i','i','i', 'n', 'o','o','o','o','o', 'u','u','u','u', 'y','y', 'A','A','A','A','A', 'C', 'E','E','E','E', 'I','I','I','I', 'N', 'O','O','O','O','O', 'U','U','U','U', 'Y'), $string); 
} 


function replaceQuote($string){
$replaceQuote=array('‘', '’', '“', '”', ''','‚','„',''',"’");
    return str_replace($replaceQuote,'\'', $string);
}

function replaceArray($string){
$replaceArray=array('—', '™','™','™','©', '®', '®','©',
    				'¡',
    				'¡',
    				'¢',
    				'¢',
    				'£',
    				'£',
    				'¤',
    				'¥',
    				'¥',
    			'¦',
    		'§',
    			'§',
    		'«',
    		'«',
    		'¬',
    		'¬',
    		'­',
    		'¯',
    		'¯',
    	'²',
    		'³',
    		'µ',
            'µ',
    		'¶',
    		'¶',
    		'·',
    		'·',
    		'¸',
    		'¸',
    		'¹',
    	'º',
    	'º','»',	'‹', '»','¼',	'½','¾','♥', '☆', '☠', '░','▒','▓','█', '★',
'♪','♫','◄','▀','▄','►', '¤', '^', '☣', '…', '†', '‡', '.:','♣','Ξ','ξ','↠','⇒','→','↞','⇐','←',
'⇔','↔','™','♠','&loz','√','∩','&Cap','∴');
  return str_replace($replaceArray, '', $string);
  }

function special_replace($string){
   $replace_from=array('ƒ', 'Œ','œ','•', '–', '—','˜','š','Š','Ÿ','ÿ','ε',
   '€','α','Α','τ','Τ','θ','Θ');

   $replace_to=array('ƒ', 'Œ','œ','•','-','-','~','š','Š','Ÿ','ÿ','ε','€','α','Α','τ','Τ','θ','Θ');
 return str_replace($replace_from, $replace_to, $string);


}

function dbSlug($slugIt){
$slugIt=html_entity_decode($slugIt);

$slugIt=replaceArray($slugIt);
$slugIt=replaceQuote($slugIt);
$slugIt=special_replace($slugIt);

//$slugIt=iconv('ISO-8859-1', 'UTF-8//TRANSLIT//IGNORE', $slugIt);
$slugIt=replace_accents($slugIt);
$slugIt=trim($slugIt);
    	return $slugIt;

    }

Ben bazen birden yerini fonksiyonları aynı karakteri var ama farklı şekillerde birden fazla yerde işlevlerini kullanın, bu yüzden benim yerine fonksiyonların birden fazla aynı karaktere sahip olabilir bu yüzden olduğu gibi verimsiz görünebilir.

Şimdi, sorun ben gidip verilere bakmak her zaman, ben karakterleri bulma ve değiştirme / çıkarma benim labirent aracılığıyla yakalanmış değil başka bir özel karakter bulmak olmasıdır.

The currently offensive character is what you'd think would be a rather harmless ' '. Which are ending up in the database as 'Â'. Not all spaces mind you, it appears only to affect some spaces (i haven't figured out why yet).

Ben daha bir hafta boyunca bu oldum ve her zaman ben 'düzeltmek' eklemek daha var, geri dönüp bakmak.

Ben 'A' kaldırmak için nasıl sormuyorum, ben içerik / veri bütünlüğünü korumak ama etrafında veri taşırken bazen gerçekten berbat-up olsun özel karakterler yok etmek olarak nasıl bir karar almak umuduyla, ve bakımı am Aranabilirlik.

I would do

preg_replace("/[^a-zA-Z0-9,-\'-!&.etc]/", "", $data);
, but am concerned that i would start screwing up words where special characters which got missed get replaced. I already had this experience where 'México' was coming out 'Mxico', so that just doesn't work.

Ben kodlama öncesi ISO-8859-1 başlığını değiştirerek, ya da herhangi bir kodlama ayarı değil denedim, ve ben hep aynı sonucu elde olsa karakter kodlaması UTF-8 olması gerekiyordu.

Ben ne var, muhtemelen bunu yapmanın en kötü yoludur eminim, ama etkili bir çözüm bulmak mümkün olmamıştır. Herhangi bir öneriniz? Benim endişem, bu bitmeyen hemen hemen hiç ve hep çeviri benim labirent aracılığıyla cevapsız olan yeni karakterleri bulma olmam.

2 Cevap

  1. UTF-8 olarak PHP dosyalarınızı kaydedin.
  2. Bağlandıktan sonra kümesi adlarını 'UTF8' yapmak;

Hala değiştirmeniz gerekiyorsa karakterler aşağıdakileri yapın:

$string = preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_COMPAT, 'UTF-8'));

EDIT:

$string = html_entity_decode(preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_COMPAT, 'UTF-8')), ENT_COMPAT, 'UTF-8');

Eğer, html_entity_decode ($ strint, ENT_QUOTES, 'UTF-8') kullanabilirsiniz

Ben ispanyolca özel karakter sorunları vardı. Bu grubu ben onu çözdüm