【问题标题】:PHP string comparison not working, file readingPHP字符串比较不起作用,文件读取
【发布时间】:2012-11-25 06:25:15
【问题描述】:

我正在使用 PHP 读取制表符分隔的 CSV 文件和管道分隔的 TXT 文件。不幸的是,即使字符(看起来)完全相同,我也无法进行字符串比较。我使用修剪来确保清除隐藏的字符,甚至尝试将类型转换为字符串。

Var dump 显示它们明显不同,但我不确定如何使它们相同?

// read in CSV file
$fh = fopen($mapping_date, 'r');
$mapping_data = fread($fh, filesize($mapping_date));
... 
// use str_getcsv to put each line into an array
// get values out that I want to compare

$this_strategy = (string)trim($strategy_name);
$row_strategy = (string)trim($row3[_Strategy_Name]);

if($this_strategy == $row_strategy) { // do something }

var_dump($this_strategy);

Vardump: string(16) "Low Spend ($0.2)"

var_dump($row_strategy);

Vardump: string(31) "Low Spend ($0.2)"

我这辈子都想不通如何完成这项工作。

【问题讨论】:

  • 我应该补充一点,我尝试了 strcmp 并尝试使用 inarray (因为它最初在数组中) if(in_array ($row_strategy, $row1["Strategies"], false))
  • 您是否使用与打开 TXT 文件相同的方法打开 CSV 文件?
  • 长度不同的事实可能表明字符串编码存在问题。打印出每个字符串的每个字符。见stackoverflow.com/a/6663560/384155
  • 是的,使用相同的方法(fopen 和 str_getcsv),但读取的两个文件的生成方式不同(这可能是字节不同的原因)。这是十六进制转储,明显不同 字符串 1:%4c%6f%77%20%53%70%65%6e%64%20%28%24%30%2e%32%29 字符串 2:%4c%00 %6f%00%77%00%20%00%53%00%70%00%65%00%6e%00%64%00%20%00%28%00%24%00%30%00%2e %00%32%00%29
  • 它来自某种数据库吗?数据库中使用什么编码?如何插入数据?

标签: php string comparison


【解决方案1】:

看起来您的数据库是用 UCS2 编码的(假设它是 MySQL)。 http://dev.mysql.com/doc/refman/5.1/en/charset-unicode-ucs2.html

您可以使用 iconv 来转换格式 - 但该页面上的 cmets 中有一个示例(但它不使用 iconv - http://php.net/manual/en/function.iconv.php#49171 )。我没有测试过。

或者,将数据库字段编码更改为 utf8_generic 或 ASCII 或文件编码为什么?


编辑:找到您想要的实际 PHP 函数:mb_convert_encoding - UCS2 是受支持的编码之一,所以在 php ini 中启用它就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2014-04-03
    • 2012-01-22
    相关资源
    最近更新 更多