PHP中的Unicode未知“ ”字符检测

时间:2010-12-27 06:33:43

标签: php unicode utf-8 utf8-decode

在PHP中有没有办法检测以下字符

我目前正在使用一些不同的算法解决许多UTF-8编码问题,并且需要能够检测字符串中是否存在。如何使用strpos

这样做

简单地将角色粘贴到我的代码库中似乎不起作用。

if (strpos($names['decode'], '?') !== false || strpos($names['decode'], '�') !== false)

4 个答案:

答案 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