PHP摆脱了数据库输出中的Â

时间:2018-04-13 09:16:08

标签: php special-characters

我正在使用正则表达式来替换空的HTML元素。但是,数据库中的字符串包含隐藏的字符。例如,在数据库中我复制了这个字符串:

<h3> </h3>

当我循环并将每个字符转换为ord的整数时,我得到以下输出:

< => 60
h => 104
3 => 51
> => 62
=> 32
< => 60
/ => 47
h => 104
3 => 51
> => 62

但是,当我从数据库中读取并直接将其放入变量时,我得到以下输出:

< => 60
h => 104
3 => 51
> => 62
� => 194
� => 160
< => 60
/ => 47
h => 104
3 => 51
> => 62

我知道160是一个不间断的空间,所以我知道这可能是正确的。然而,我没有得到的是为什么我得到一个额外的char 194(根据谷歌)。

我怎样摆脱我得到的?不间断的空间是可以理解的,但我没有得到Â。

更新:

数据库中的数据存储为utf8_general_ci。我将PDO连接中的字符集设置为utf8。

UPDATE2:

我很好奇为什么我得到一个(char 194)开头。在数据库中的

之间,根据我的光标有一个字符。

我想删除<h3>[ONLY SPACES]</h3>,但由于它包含随机字符194,因此我无法使用正则表达式正确替换它,因为194不是空格。

3 个答案:

答案 0 :(得分:2)

PHP的ord()函数与所有主要的内置函数一样,对字符编码一无所知,只是将字符串看作一系列字节。它所做的只是查看字符串的单个字节,并告诉您该字节的值为0到256之间的数字。

但是,您的文本是UTF-8,其中一些字符占用多个字节;因此,当您一次查看一个字节时,任何高于127的数字实际上都是较长序列的一部分。所以,没有“”。

真正有字节序列“194,160”;或以十六进制表示“C2 A0”。如果你在conversion tool such as this one中查找,你会发现UTF-8中的字节序列代表Unicode代码点A0或160,你已经发现它是一个不间断的空间。

就是这样:你的字符串被正确编码,但是包含一个你没看到的字符,因为它是一种特殊的空间类型。

答案 1 :(得分:0)

在循环中使用php iconv函数来替换db

中的特殊字符

$ text =“这是欧元符号'€'。”; $ op = iconv(“UTF-8”,“ISO-8859-1 // TRANSLIT”,$ text),PHP_EOL;

答案 2 :(得分:0)

you can send the text to specific function mentioned below


function ConvertToUTF8($text){

    $encoding = mb_detect_encoding($text, mb_detect_order(), false);

    if($encoding == "UTF-8")
    {
        $text = mb_convert_encoding($text, 'UTF-8', 'UTF-8');    
    }


    $out = iconv(mb_detect_encoding($text, mb_detect_order(), false), "UTF-8//IGNORE", $text);


    return $out;
}