【问题标题】:Searching an ANSI special character in a file with PHP使用 PHP 在文件中搜索 ANSI 特殊字符
【发布时间】:2021-08-11 04:13:59
【问题描述】:

我有以下binary file,我需要阅读它并找到字符'®️'。

如果我在 Windows 记事本中打开文件,我可以找到该字符。 如果我打开托管文件,我可以找到角色

但是在尝试使用 PHP 时,我找不到字符。

这是我迄今为止尝试过的:

$handle = fopen($filename, "r");
$fsize = filesize($filename);
$contents = "";

while (!feof($handle)) {
        $contents .= fread($handle, 8192);
}
$r = "®️";

$strpos = strpos($contents, $r);
$mb_strpos = mb_strpos($contents, $r);

echo "<p>strpos function searching for '{$r}': " . ($strpos === false ? "Not found" : $strpos) . "</p>";
echo "<p>mb_strpos function searching for '{$r}': " . ($mb_strpos === false ? "Not found" : $mb_strpos) . "</p>";
                    
$found = false;
for ($i = 0; $i < strlen($contents); $i++) {
    $byte = $contents[$i];
    if ($byte == $char) {
         echo "<p>reading character per character of 'contents', {$r} position is {$i}</p>";
         $found = true;
         break;
    }
}

我也尝试过使用函数 stream_get_contents

$offset = 0;
while ($byte = stream_get_contents($handle, 1, $offset)) {
    if ($byte == "$r") {
        echo "<p>{$r} position is {$i}</p>";
        break;
    }

    $offset++;
}

我还尝试使用以下函数更改变量 $r 的编码

utf8_decode($r);
mb_convert_encoding($r, 'CP1252');
mb_convert_encoding($r, 'CP1252', 'UTF-8');
mb_convert_encoding($r, 'Windows-1252');
mb_convert_encoding($r, 'Windows-1252', 'UTF-8')

有人知道如何正确地找到文件中的字符吗?

【问题讨论】:

标签: php string file search ansi


【解决方案1】:

我做了一个测试,这个测试代码工作正常(我没有改变编码):

$handle = fopen('test.txt','r');
$contents = fread($handle, filesize ('test.txt'));
var_dump($contents);
var_dump(strpos($contents,"®"));
fclose($handle);

而test.txt中的文字是:

laksjdflakjs®️alskjdf

当我做这个测试时,我发现了一些奇怪的东西:你的问题中的“®️”包含一个多余的空格字符,也许这就是你的代码运行不好的原因

【讨论】:

  • 我创建了一个新文件,其文本与您的方式相同,并且找到了该字符。在记事本++中打开两个文件时,注意到在窗口的右下角,文件 1.tmp 显示“ANSI”,新文件显示“UTF-8”,所以我尝试使用 utf8_encode 函数并且它有效,我可以找到特点。但是,将文件更改为 UTF-8 会使文件无法用于我想要的目的。我需要找到一种方法来读取 1.tmp 而不将其更改为 UTF-8 ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
相关资源
最近更新 更多