php - 处理特殊字符(html_entity_decode、inov 等)

标签 php mysql character-encoding

我一直在努力将一堆字符转换为核心 utf-8 以将它们存储在我的数据库中。

PHP iconv 在许多字符上失败,所以我被迫构建自己的“解决方案”,如果它不起作用,这实际上不是一个解决方案,并且它在 Windows 中几乎完全失败,因此使用 iconv 进行开发大部分都是徒劳的,因为我必须在测试服务器上进行“开发”。另外,由于 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);
,但担心我会开始搞砸单词,其中丢失的特殊字符被替换。 我已经有过“México”变成“Mxico”的经历,所以这是行不通的。

字符编码应该是UTF-8,尽管我尝试在编码之前将 header 更改为ISO-8859-1,或者不设置任何编码,但总是得到相同的结果。

我确信我所拥有的可能是最糟糕的方法,但我一直无法找到有效的解决方案。有什么建议么?我担心的是,这几乎永无止境,而且我总是在迷宫般的翻译中找到被遗漏的新角色。

最佳答案

  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'));

编辑:

$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');

关于php - 处理特殊字符(html_entity_decode、inov 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1319169/

相关文章:

php - 上传的图片未在 Google Cloud Storage 上设置为公开 - Google App Engine

php - 如何从php中的文件中读取由空格分隔的整数

php - 将数据从一个表插入到另一个php sql

java - 如何在 Java(和其他)中确定 "FI"的连字

linux - 文本编码 - 在 Windows 上很好,但不是 nix

Linux 和 unicode

php - 使用 PHP 从 HTTP 目录获取文件列表

PHP 问题 "Cannot send session cookie"

php - 有没有办法在 SQL 查询中执行条件逻辑?

mysql - 用户 'root' 已超出 'max_questions' 资源