Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP strlen()或mb_strlen()返回意外结果_Php_Strlen - Fatal编程技术网

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

PHP strlen()或mb_strlen()返回意外结果,php,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

使用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个字符开始计算“.”

我已经浏览了几个地方,包括并将建议的转换添加到页面中:

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>";
    }
?>
解决方案:

<?php

require_once 'Hexdump.php';
hexdump('1.1.1');
我给@hek2mgl投票是因为他的hexdump帮助我确定我不是疯了,而是把“.”算作3

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

谢谢大家的帮助

我得到了:

<?php

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

<?php

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

我知道这不是答案,但出于代码格式的原因

以下内容保存在UTF-8文件中,在我的设置中

<?php

echo 'mbstring.internal_encoding: '    . ini_get( 'mbstring.internal_encoding' ) . "\r\n";
echo 'mbstring.func_overload: '        . ini_get( 'mbstring.func_overload' ) . "\r\n";
echo 'mbstring.language: '             . ini_get( 'mbstring.language' ) . "\r\n";
echo 'mbstring.strict_detection: '     . ini_get( 'mbstring.strict_detection' ) . "\r\n";
echo 'mbstring.substitute_character: ' . ini_get( 'mbstring.substitute_character' ) . "\r\n";
echo 'mbstring.detect_order: '         . ini_get( 'mbstring.detect_order' ) . "\r\n";
echo 'mbstring.encoding_translation: ' . ini_get( 'mbstring.encoding_translation' ) . "\r\n";
echo "\r\n";

function outputLengths( $sString )  {
    echo( "mb_strlen('$sString', 'utf-8') = " . mb_strlen($sString, 'utf-8')  ."\r\n" );
    echo( "strlen('$sString') = " . strlen($sString)  ."\r\n\r\n" );
}

outputLengths( '1' );
outputLengths( '1.1' );
outputLengths( '1.1.1' );
outputLengths( '1.1.3.1' );

你得到了什么?

变量来自哪里? 你能给我们看一下真实的代码(而不是伪代码)吗

我试图复制所描述的行为,但无法复制。以下是我进行的一些测试:

$strArray = array(
    '.',
    '1',
    '1.1',
    '1.1.1',
    1,
    1.1,
);

for ($i = 0; $i<count($strArray); ++$i) {
    print "{$strArray[$i]} -> strlen: ".strlen($strArray[$i])." <br/>";
    print "{$strArray[$i]} -> mb_strlen: ".mb_strlen($strArray[$i])." <br/>";
    print '<br>';  
}

正如所料

您的dot有什么字符代码?
php-r'echo-ord(“.”)的输出是什么
您建议的代码不太有效-您没有引用字符串,因此它们被当作数字处理,因此它们无效。有很多值得纠正的地方……很明显,您的代码的输出是strlen(1.1.1.3.3)
,但它实际上使用字符串参数调用这些函数?我无法重现您的问题:@comfrek:因为您的输入是字符串,所以OP不是。首先:这是一个可爱的小程序包!结果如下:是的,这就是我想要的输出!!:)。。您可以看到每个
前面都有一个
0
字节。字符串来自何处?我无法控制要导入的csv文件,但知道每次都是一样的。有没有办法确定它的编码,以便mb_strlen()能够正确读取它?@Edward这不是真正的编码。以前从没见过这个。你能显示完整的csv吗?(在pastebin上?)。。。但是,我已经复制并粘贴到了pastebin:将代码复制并粘贴到我的系统中会得到与您显示的相同的结果。听起来您对@hek2mglm的理解是正确的,测试只是帮助确认答案的状态-这是一个数据问题。所以我就不理这根线了。
mbstring.internal_encoding: UTF-8
mbstring.func_overload: 0
mbstring.language: neutral
mbstring.strict_detection: 0
mbstring.substitute_character:
mbstring.detect_order:
mbstring.encoding_translation: 0

mb_strlen('1', 'utf-8') = 1
strlen('1') = 1

mb_strlen('1.1', 'utf-8') = 3
strlen('1.1') = 3

mb_strlen('1.1.1', 'utf-8') = 5
strlen('1.1.1') = 5

mb_strlen('1.1.3.1', 'utf-8') = 7
strlen('1.1.3.1') = 7
$strArray = array(
    '.',
    '1',
    '1.1',
    '1.1.1',
    1,
    1.1,
);

for ($i = 0; $i<count($strArray); ++$i) {
    print "{$strArray[$i]} -> strlen: ".strlen($strArray[$i])." <br/>";
    print "{$strArray[$i]} -> mb_strlen: ".mb_strlen($strArray[$i])." <br/>";
    print '<br>';  
}
. -> strlen: 1 
. -> mb_strlen: 1 

1 -> strlen: 1 
1 -> mb_strlen: 1 

1.1 -> strlen: 3 
1.1 -> mb_strlen: 3 

1.1.1 -> strlen: 5 
1.1.1 -> mb_strlen: 5 

1 -> strlen: 1 
1 -> mb_strlen: 1 

1.1 -> strlen: 3 
1.1 -> mb_strlen: 3