首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mb_strlen()或mb_strlen()返回意外结果

mb_strlen()或mb_strlen()返回意外结果
EN

Stack Overflow用户
提问于 2013-11-20 14:30:11
回答 3查看 1.9K关注 0票数 3

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

代码语言:javascript
复制
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()度量这些字符串的长度时,结果如下

代码语言:javascript
复制
------------------------------
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
------------------------------

它似乎是在计数“。三个角色?我想知道做一个小的函数来补偿可预测的“误算”,但我想知道它为什么要计算“。作为三个字符开始。

我已经浏览了几个地方,包括这篇文章读上面提到的那篇文章,,并将建议的转换添加到页面中:

代码语言:javascript
复制
mb_language('uni');
mb_internal_encoding('UTF-8');
$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8');

怎么回事?

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

这是代码:

代码语言:javascript
复制
<?
    $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>";
    }
?>

以下是结果

代码语言:javascript
复制
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投了一票,因为他的黑帮帮我确定了我没有疯,它真的是在计算“。as 3,如图所示.

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

谢谢大家的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-20 14:36:57

我得到了:

代码语言:javascript
复制
<?php

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

如预期的那样。在您的例子中,.似乎不是普通的点,而是一个特殊的unicode字符。请显示您输入数据的六转储。您可以使用六角 (我为这种情况编写了包):

安装

代码语言:javascript
复制
sudo pear channel-discover www.metashock.de/pear
sudo pear install metashock/Hexdump

使用:

代码语言:javascript
复制
<?php

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

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

票数 3
EN

Stack Overflow用户

发布于 2013-11-20 14:42:30

我知道这不是一个答案,而是因为代码格式化的原因。

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

代码语言:javascript
复制
<?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' );

产出:

代码语言:javascript
复制
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

你得到的是啥?

票数 0
EN

Stack Overflow用户

发布于 2013-11-20 14:50:53

变量从何而来?你能给我们看看真正的代码(而不是伪码)吗?

我试图复制所描述的行为,但做不到。下面是我做的一些测试:

代码语言:javascript
复制
$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>';  
}

这一产出如下:

代码语言:javascript
复制
. -> 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

如预期

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20098641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档