Я имею дело с фильтрующей системой, которая в настоящее время работает на PHP, и я ударил кирпичную стену, пытаясь сделать из себя указатель на пользователя.
Я получаю список пользователей из базы данных, заказанной по фамилии, которая дает нам теоретический список:
[
{
"first name" : "Bob",
"Last name" : "Éthier"
},
{
"first name" : "Paul",
"Last name" : "Foo"
},
{
"first name" : "Alice",
"Last name" : "Smith"
},
]
Теперь возникают проблемы, когда я пытаюсь составить список упомянутых пользователей, начинающихся с определенного алфавитного письма "A, B, C,..."
Если бы я сделал что-то вроде
if(strtoupper(substr($arr["Last name"], 0, 1)) >= $filterLetter)
// Add account to display list to eventually show on page
Я бы хотел, чтобы, когда я выбираю букву "F" в качестве фильтра, в моем списке отображается F и выше, поэтому в основном это начиналось бы с каждого другого человека с буквой F и в конечном итоге продолжалось, а также отображалось Смит и так далее на.
Что происходит в настоящее время, так это то, что если фильтр букв, который я выбираю, находится выше некоторого акцентированного символа, строка сравнивает часть ошибок программы и в любом случае считает ее хорошей и отображает ее.
В настоящее время, когда я выбираю F как "начальный индекс", Боб Этье показывает, что это не так, и я честно не знаю, почему это происходит. Кажется, что это происходит с каждым акцентированным письмом не только É.
Есть что-то, что я пропускаю, потому что мне действительно кажется, что "É"> F должно быть ложным, но в моем случае это правда.
Изменение: Моя система базы данных: MySql, а моя кодировка - latin1, а collation - latin1_swedish_ci (это может быть очень хорошо может быть частью проблемы), символы действительно отображаются на странице.
Вы можете использовать iconv для удаления диакритики. Обязательно установите языковой стандарт, или iconv может возвращать неожиданные символы. Следующее должно работать:
setlocale(LC_ALL, "en_US.utf8");
$char = mb_substr($arr["Last name"], 0, 1, 'UTF-8');
$char = iconv('UTF-8','ASCII//TRANSLIT',$char);
Затем используйте $ char для сравнения с вашим индексом.
Изменить: substr не работает с акцентированными символами, используя mb_substr и передавая UTF-8, поскольку кодировка устраняет проблему.
setlocale(LC_ALL, "en_US.utf8"); $char = substr("Éthier", 0, 1); $char = iconv('UTF-8','ASCII//TRANSLIT',$char); var_dump($char);
- это печатает bool(false)
.
Вы можете использовать приведенную ниже функцию для преобразования ваших акцентированных строк в обычные строки, а затем продолжить свои необходимые проверки.
function removeAccents($str) {
$a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā', 'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď', 'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ', 'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ', 'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ', 'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ', 'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ', 'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ', 'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż', 'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ', 'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ', 'Ά', 'ά', 'Έ', 'έ', 'Ό', 'ό', 'Ώ', 'ώ', 'Ί', 'ί', 'ϊ', 'ΐ', 'Ύ', 'ύ', 'ϋ', 'ΰ', 'Ή', 'ή');
$b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's', 'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l', 'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o', 'Α', 'α', 'Ε', 'ε', 'Ο', 'ο', 'Ω', 'ω', 'Ι', 'ι', 'ι', 'ι', 'Υ', 'υ', 'υ', 'υ', 'Η', 'η');
return str_replace($a, $b, $str);
}
$str
- ваша акцентированная строка, и результат, возвращаемый функцией, будет приемлемой строкой, хранящейся в $normalString
$str = 'Chloé'
$normalString = removeAccents($str);
Таким образом, вы не должны иметь проблемы с акцентированными символами.