我正在使用正则表达式来替换空的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不是空格。
答案 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;
}