【问题标题】:Different length for same string相同字符串的不同长度
【发布时间】:2012-12-23 04:20:18
【问题描述】:

我得到同一个字符串的两个不同的计数值

 $val1 = $data->sheets[0]['cells'][5][1];//thise value is from excel sheet 
 $val2 = $obj->number; // this is the value from database

 var_dump(trim($val1)) , var_dump(trim($val2))

string(19) "US5922335A" ,  string(10) "US5922335A" 

第一个值是从 excel 表(xls)中获取的,第二个值是在执行 Select 查询后从 Mysql 表中获取的 ,我无法进行比较,因为两者的长度不同。

if($val1==$va2)
{
    echo "Found it ";   
}

我怎样才能使它具有相同的长度,以便我可以比较它。

【问题讨论】:

  • 发布更多代码,获取这些值的代码
  • 我添加了一些代码
  • 您的 Excel 文件是什么代码页?
  • @MarkBaker 我正在使用 PHPExcel 的 IOFactory.php 文件从 excel 生成 xls 文件,我无法弄清楚它使用的是什么代码页
  • @MarkBaker,我怎么知道它正在使用什么代码页

标签: php mysql string excel compare


【解决方案1】:

不是直接回答您的问题,但让我们首先找出string(19) "US5922335A" 背后的真正含义。请尝试

foreach(array($val1,$val2) as $v ) {
    for($i=0; $i<strlen($v); $i++) {
        printf('%02x ', ord($v[$i]));
    }
    echo "<br />\n";
}

if($val1==$val2) {
    echo "Found it ";   
}

并添加应该类似于的输出

55 53 35 39 32 32 33 33 35 41 <br />
55 53 35 39 32 32 33 33 35 41 <br />

回答你的问题。


编辑:您的数据似乎是小端 UCS-2/UTF-16 编码的。

我越来越像
字符串(22)“EP2153814A1”字符串(10)“US5922335A”
45 00 50 00 32 00 31 00 35 00 33 00 38 00 31 00 34 00 41 00 31 00
55 53 35 39 32 32 33 33 35 41

由于该字符串值的数据源是 Excel 工作表,因此最简单的解决方案可能是使用 mb_convert_encoding() 更改编码。

$val1 = $data->sheets[0]['cells'][5][1];
$val1 = mb_convert_encoding($val1, 'ISO-8859-1', 'UTF-16LE');

【讨论】:

  • 我得到字符串(22)“EP2153814A1”字符串(10)“US5922335A”45 00 50 00 32 00 31 00 35 00 33 00 38 00 31 00 34 00 41 00 31 00 55 53 35 39 32 32 33 33 35 41
  • 这看起来像小端 UTF-16 或 UCS-2。编辑:哦,您 $val1 的数据源是 excel。是的,Windows 和 Office 使用 UTF16/UCS-2LE 作为其内部编码。
  • 我在数据库中使用 utf8_general_ci 作为该列的排序规则,是否需要将其更改为 utf16_general_ci
  • 不,是的,不......这个问题的mysql方面涉及不止一个字符集设置。单独更改内部存储编码不会改变任何事情。您的脚本检索根据连接字符集编码的值,这将是您必须更改的值,例如通过docs.php.net/manual/en/mysqli.set-charset.php - 但请记住,utf-16 编码有两种不同的“风格”,小端和大端。让我们以字符E为例,在ISO-8859中它被编码为单字节0x45,UTF-16BE -> 0x00 0x45,UTF-16LE -> 0x45 0x00,你需要LE
  • 谢谢我从你的回答中得到了一些概念,并手动将 xls 文件更改为 UTF-8 字符集,现在可以使用了,谢谢
【解决方案2】:

我敢打赌,Mysql 表将列定义为char 而不是varchar。如果是这样,则意味着第一个值有尾随空格。

在进行相等检查之前,您需要删除尾随空格。

if(trim($val1)==$va2)
{
    echo "Found it ";   
}

【讨论】:

  • $val1.rstrip() 那将是 python ;-) rtrim($val1)
  • 感谢您的回复,修剪后我得到了那个值。 ,从excel单元格读取时,我得到计数​​为19,但从数据库中我得到计数​​为10,请帮助我,我需要进行比较
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
相关资源
最近更新 更多