在PHP中有没有办法检测以下字符�
?
我目前正在使用一些不同的算法解决许多UTF-8编码问题,并且需要能够检测字符串中是否存在�
。如何使用strpos
?
简单地将角色粘贴到我的代码库中似乎不起作用。
if (strpos($names['decode'], '?') !== false || strpos($names['decode'], '�') !== false)
答案 0 :(得分:17)
使用iconv()
参数使用//IGNORE
将UTF-8字符串转换为UTF-8会产生无效的UTF-8字符被丢弃的结果。
因此,您可以通过比较iconv操作之前和之后的字符串长度来检测损坏的字符。如果它们不同,它们就会包含一个破碎的字符。
测试用例(确保将文件保存为UTF-8):
<?php
header("Content-type: text/html; charset=utf-8");
$teststring = "Düsseldorf";
// Deliberately create broken string
// by encoding the original string as ISO-8859-1
$teststring_broken = utf8_decode($teststring);
echo "Broken string: ".$teststring_broken ;
echo "<br>";
$teststring_converted = iconv("UTF-8", "UTF-8//IGNORE", $teststring_broken );
echo $teststring_converted;
echo "<br>";
if (strlen($teststring_converted) != strlen($teststring_broken ))
echo "The string contained an invalid character";
理论上,您可以删除//IGNORE
并简单地测试失败(空)iconv
操作,但是iconv失败可能还有其他原因而不仅仅是无效字符...我不知道不知道。我会使用比较方法。
答案 1 :(得分:3)
我正在做的是检测并纠正UTF-8中未编码的字符串的编码,这是我所期待的:
$encoding = mb_detect_encoding($str, 'utf-8, iso-8859-1, ascii', true);
if (strcasecmp($encoding, 'UTF-8') !== 0) {
$str = iconv($encoding, 'utf-8', $str);
}
答案 2 :(得分:1)
据我所知,问号符号不是单个字符。标准字体集中有许多不同的字符代码未映射到符号,这是使用的默认符号。要在PHP中进行检测,首先需要知道您正在使用的字体。然后你需要查看字体实现,看看代码的哪些范围映射到“?”符号,然后查看给定字符是否属于其中一个范围。
答案 3 :(得分:0)
我使用CUSTOM方法(使用str_replace
)来清理未定义的字符:
$input='a³';
$text=str_replace("\n\n", "sample000" ,$text);
$text=str_replace("\n", "sample111" ,$text);
$text=filter_var($text,FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW);
$text=str_replace("sample000", "<br/><br/>" ,$text);
$text=str_replace("sample111", "<br/>" ,$text);
echo $text; //outputs ------------> a3