борется со специальными символами (html_entity_decode, iconv и т. д.) - PullRequest
2 голосов
/ 23 августа 2009

Я пытался перевести несколько символов в ядро ​​utf-8, чтобы сохранить их в моей базе данных.

PHP iconv не работает на многих символах, поэтому я был вынужден создать свое собственное «решение», которое на самом деле не является решением, если оно не работает, и почти полностью завершается с ошибкой в ​​Windows, поэтому разработка с помощью iconv в основном бесплодны, так как я должен 'dev' на тестовом сервере. Кроме того, так как iconv пропускает кучу символов, это не очень полезно.

Вот что у меня есть, моя функция делает

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;

    }

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

Теперь проблема в том, что каждый раз, когда я иду и смотрю на данные, я нахожу ДРУГОЙ специальный символ, который не проходит через мой лабиринт поиска и замены / удаления символов.

В настоящее время оскорбительный персонаж - это то, что вы считаете довольно безобидным ». Которые попадают в базу данных как «В». Не все пробелы имеют в виду, кажется, что это влияет только на некоторые пробелы (я еще не выяснил, почему).

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

Я не спрашиваю, как удалить 'Â', я надеюсь получить решение о том, как сохранить целостность содержимого / данных, но не иметь специальных символов, которые иногда оказываются запутанными при перемещении данных и поддержание возможности поиска.

Я бы сделал

preg_replace("/[^a-zA-Z0-9,-\'-!&.etc]/", "", $data);
, но меня беспокоит, что я начну портить слова, где заменяются пропущенные специальные символы. У меня уже был такой опыт, когда «Мехико» выходил «Мехико», так что это просто не работает.

Кодировка символов должна быть UTF-8, хотя я пытался изменить заголовок на ISO-8859-1 перед кодированием или не задавать какую-либо кодировку, и я всегда получаю один и тот же результат.

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

Ответы [ 2 ]

2 голосов
/ 23 августа 2009
  1. Сохраните ваши файлы PHP как UTF-8.
  2. После подключения выполните SET NAMES 'UTF8';

Если вам все еще нужно заменить символы, сделайте следующее:

$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');
1 голос
/ 03 апреля 2013

вы можете использовать, html_entity_decode ($ strint, ENT_QUOTES, 'UTF-8')

У меня были проблемы с специальными символами испанского языка. С этим я решил

...