我一直在努力将一堆字符转换为核心 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,或者不设置任何编码,但总是得到相同的结果。
我确信我所拥有的可能是最糟糕的方法,但我一直无法找到有效的解决方案。有什么建议么?我担心的是,这几乎永无止境,而且我总是在迷宫般的翻译中找到被遗漏的新角色。
最佳答案
- 将 PHP 文件保存为 UTF-8。
- 连接后执行 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/