使用PHP,我正在尝试确定这些字符串中的长度(字符数量):
看起来它把“.”算作了3个字符?我想只需编写一个小函数来补偿可预测的“计数错误”,但是我想知道为什么一开始就将“。”算作3个字符。
我已经查看了几个地方,包括此SO文章和阅读所提到的文章,并在页面中添加了建议的转换。
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个字符。
我已经查看了几个地方,包括此SO文章和阅读所提到的文章,并在页面中添加了建议的转换。
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,因为他的十六进制转储帮助我确定我不是疯了,它确实将“.” 计算为 3,如此所示。
我无法改变导入格式,所以我只能添加代码来进行补偿:
感谢大家的帮助!
php -r 'echo ord(".");'
的输出是什么? - Viacheslav Kondratiukstrlen(1.1.1.3.3)
,但实际上它使用字符串参数调用这些函数? - user395760