LINUX.ORG.RU

Как в этом php сравнивать многобайтовые строки?

 , ,


1

2

Получаю я строку 'Cтолешница:' и сравниваю с строкой 'Столешница:' получаемая кодировка неизвестна, поэтому я привожу её к одной. Короче делаю так

function local_string_decode($str)
{
	$decode = mb_convert_encoding($str,mb_detect_encoding($str), "UTF-8");
	return $decode;
}
//тут полученная строка при парсинге
$str1 = local_string_decode($product->characteristics_countertop_material_buff[$i]->plaintext);
//тут строка для сравнения
$str2 = local_string_decode('Столешница:');
//для сравнения многобайтовых строк применяется вроде как collator
if( collator_compare(collarot_create('ru_RU'),$str1,$str2)==0)
{
   echo "Yeeeaa \n";
}else{
   echo "Fail :(\n";
}		

Получаю fail :(

$str1 = local_string_decode($product->characteristics_countertop_material_buff[$i]->plaintext);
$str2 = local_string_decode('Столешница:')
echo $str1."##".$str2."\n";
echo mb_detect_encoding($str1)."##".mb_detect_encoding($str2)."\n";

всё ровно

Cтолешница:##Столешница:
UTF-8##UTF-8

php --version

PHP 7.0.19-1 (cli) (built: May 11 2017 14:04:47) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.19-1, Copyright (c) 1999-2017, by Zend Technologies

Что я делаю не так и чего я не знаю?

★★★★★

Ответ на: комментарий от Dron

У тебя первые символы разные, логично, что строки считаются как отличающиеся.

[17] boris> if('Cтолешница:' === 'Столешница') { echo "y\n"; } else { echo "n\n"; }
n
[18] boris> if('Столешница:' === 'Столешница:') { echo "y\n"; } else { echo "n\n"; }
y
[19] boris> ord("C");
// 67
[20] boris> ord("С");
// 208
[21] boris>

theanonymous ()

$decode = mb_convert_encoding($str,mb_detect_encoding($str), «UTF-8»); - тут ошибка. У функции mb_convert_encoding второй аргумент это целевая кодировка, а третий необязательный аргумент - это исходная кодировка, которая нужна для исключения магии.

anonymous ()