PHP strlen() 或 mb_strlen() 返回意外结果

标签 php strlen

使用 PHP,我试图确定如下字符串的长度(字符数):

1
1.1
1.1.1
1.1.2
1.1.3
1.1.3.1
1.1.3.2
1.1.4
1.1.5
1.1.6
1.1.7

等等

当用mb_strlen()或strlen()测量这些字符串的长度时,结果为

------------------------------
value   | mb_strlen() | strlen()
------------------------------
1       | 1           | 1
------------------------------
1.1     | 5           | 5
------------------------------
1.1.1   | 9           | 9
------------------------------
1.1.1.1 | 13          | 13
------------------------------
1.1.1.2 | 13          | 13
------------------------------
1.1.1.3 | 13          | 13
------------------------------

它似乎在计算“.”作为 3 个字符?我想知道是否只做一个小功能来补偿可预测的“错误计数”,但我想知道为什么它要计算“。”作为 3 个字符开头。

我已经浏览了几个地方,包括 this SO articleread the article mentioned,将建议的转化添加到页面:

mb_language('uni');
mb_internal_encoding('UTF-8');
$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8');

什么给了?

编辑: 字符串作为 csv 导入的一部分导入。

代码如下:

<?
    $f = fopen("s2db.csv", "r");
    while (($line = fgetcsv($f)) !== false) {

            $colcount = 0;
            foreach ($line as $cell) {
                //lets get the lines into variables first
                //there only five, so just count
                switch ($colcount) {
                    case '0':
                        $item = $cell;
                        break;
                    case '1':
                        $itemtitle = htmlspecialchars($cell);
                        break;
                    case '2':
                        $itemsubject = htmlspecialchars($cell);
                        break;
                    case '3':
                        $itemnumber = htmlspecialchars($cell);
                        break;
                    case '4':
                        $itemqty = htmlspecialchars($cell);
                        break;
                    case '5':
                        $itemfilename = htmlspecialchars($cell);
                        break;                    
                }
                $colcount++;
            }
            $itemlen = strlen($item);
            echo "Value = " . $item . " | strlen() Length = " . $itemlen .  "|  mb_strlen() = " . mb_strlen($item) . "</br>";
    }
?>

这是结果

Value = 1 | strlen() Length = 3| mb_strlen() = 3
Value = 1.1 | strlen() Length = 7| mb_strlen() = 7
Value = 1.1.1 | strlen() Length = 11| mb_strlen() = 11
Value = 1.1.1.1 | strlen() Length = 15| mb_strlen() = 15
Value = 1.1.1.2 | strlen() Length = 15| mb_strlen() = 15
Value = 1.1.1.3 | strlen() Length = 15| mb_strlen() = 15
Value = 1.1.1.3.1 | strlen() Length = 19| mb_strlen() = 19
Value = 1.1.1.3.2 | strlen() Length = 19| mb_strlen() = 19
Value = 1.1.1.3.3 | strlen() Length = 19| mb_strlen() = 19
Value = 1.1.1.4 | strlen() Length = 15| mb_strlen() = 15

解决方案:

我给了 @hek2mgl 投票,因为他的 hexdump 帮助我确定我没有疯,它确实在计算“。”作为 3,as shown here .

对于导入格式我无能为力,所以我将添加代码来补偿:

感谢大家的帮助!

最佳答案

我得到了:

<?php

$str = '1.1.1';
var_dump(mb_strlen($str, 'utf-8'));  // 5
var_dump(strlen($str));              // 5

如预期。似乎 . 在您的情况下不是常规点,而是特殊的 unicode 字符。请显示您输入数据的 hexdump。您可以使用 Hexdump (我为这种情况编写了包):

安装:

sudo pear channel-discover www.metashock.de/pear
sudo pear install metashock/Hexdump

用法:

<?php

require_once 'Hexdump.php';
hexdump('1.1.1');

看看幕后的真实人物是什么会很有趣。

关于PHP strlen() 或 mb_strlen() 返回意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20098641/

相关文章:

c - 输入返回正确的字符串但不运行函数

python - 用于显示 "One"值的 For 循环与 While 循环 (CS50)

c++ - 为什么 c++ std::string.length() 在 VS2017 上比 strlen() 慢?

c - 运行简单的字符串 C 程序时出现总线错误

php - 配置对象中的属性链接和 isset

php - PDOStatement->bindParam 不起作用

php oop文件上传

php - MySQL/MariaDB 是否对 PHP (7.x) mysqli_connect 的数据库密码进行哈希处理?

php - foreach by reference 循环中 unset 的奇怪行为

c - 确定c中位 block 的大小