Как делают я заменяю:
в PHP? Действительно ли это возможно? Я читал где-нибудь, я мог сделать некоторую математику со значением ASCII основного символа и значением ASCII диакритического знака, но я не могу найти ссылки теперь.
Этот ответ неверен. Я не понимал нормализации Unicode, когда писал ее. Посмотрите комментарий francadaval и ссылку
Для этого ознакомьтесь с классом Normalizer. Документация хороша, поэтому я просто свяжу ее, вместо того чтобы повторять здесь:
http://www.php.net/manual/en/class.normalizer.php
В частности, член normalize этого class:
http://www.php.net/manual/en/normalizer.normalize.php
Обратите внимание, что нормализация Unicode имеет несколько форм, и вы, похоже, хотите, чтобы форма нормализации KD (NFKD) Compatibility Decomposition, хотя вы должны прочитать документацию, чтобы убедиться.
Вы не должны пытаться использовать для этого свою собственную функцию: слишком много вещей могут пойти не так, и использование предоставленной функции - гораздо лучшая идея.
Люди часто используют str_replace
или strtr
и большой список символов для преобразования «из» и «в» - даже если это не так. Выглядит довольно красиво ...
Другое решение, я полагаю, могло бы использовать что-то вроде iconv
с опцией // TRANSLIT
- но не всегда работает, из что я помню ...
Кроме того, если вы используете PHP 5.3, новый класс Normalizer
может быть интересен; -)
Если у вас нет доступа к классу нормализатора или вы просто не хотите его использовать, вы можете использовать следующую функцию для замены большинства (всех?) Распространенных акцентов.
function Unaccent($string)
{
return preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8'));
}
Особенно при сопоставлении текстов друг с другом или с ключевыми словами полезно предварительно нормализовать тексты. Следующая функция удаляет все диакритические знаки (отмечает акценты) из заданного текста в кодировке UTF8 и возвращает текст ASCii.
Убедитесь, что у вас установлено расширение PHP-Normalizer (intl и icu).
Совет: вы также можете преобразовать текст в нижний регистр перед выполнением процедур сопоставления ...
<?php
function normalizeUtf8String( $s)
{
// Normalizer-class missing!
if (! class_exists("Normalizer", $autoload = false))
return $original_string;
// maps German (umlauts) and other European characters onto two characters before just removing diacritics
$s = preg_replace( '@\x{00c4}@u' , "AE", $s ); // umlaut Ä => AE
$s = preg_replace( '@\x{00d6}@u' , "OE", $s ); // umlaut Ö => OE
$s = preg_replace( '@\x{00dc}@u' , "UE", $s ); // umlaut Ü => UE
$s = preg_replace( '@\x{00e4}@u' , "ae", $s ); // umlaut ä => ae
$s = preg_replace( '@\x{00f6}@u' , "oe", $s ); // umlaut ö => oe
$s = preg_replace( '@\x{00fc}@u' , "ue", $s ); // umlaut ü => ue
$s = preg_replace( '@\x{00f1}@u' , "ny", $s ); // ñ => ny
$s = preg_replace( '@\x{00ff}@u' , "yu", $s ); // ÿ => yu
// maps special characters (characters with diacritics) on their base-character followed by the diacritical mark
// exmaple: Ú => U´, á => a`
$s = Normalizer::normalize( $s, Normalizer::FORM_D );
$s = preg_replace( '@\pM@u' , "", $s ); // removes diacritics
$s = preg_replace( '@\x{00df}@u' , "ss", $s ); // maps German ß onto ss
$s = preg_replace( '@\x{00c6}@u' , "AE", $s ); // Æ => AE
$s = preg_replace( '@\x{00e6}@u' , "ae", $s ); // æ => ae
$s = preg_replace( '@\x{0132}@u' , "IJ", $s ); // ? => IJ
$s = preg_replace( '@\x{0133}@u' , "ij", $s ); // ? => ij
$s = preg_replace( '@\x{0152}@u' , "OE", $s ); // Œ => OE
$s = preg_replace( '@\x{0153}@u' , "oe", $s ); // œ => oe
$s = preg_replace( '@\x{00d0}@u' , "D", $s ); // Ð => D
$s = preg_replace( '@\x{0110}@u' , "D", $s ); // Ð => D
$s = preg_replace( '@\x{00f0}@u' , "d", $s ); // ð => d
$s = preg_replace( '@\x{0111}@u' , "d", $s ); // d => d
$s = preg_replace( '@\x{0126}@u' , "H", $s ); // H => H
$s = preg_replace( '@\x{0127}@u' , "h", $s ); // h => h
$s = preg_replace( '@\x{0131}@u' , "i", $s ); // i => i
$s = preg_replace( '@\x{0138}@u' , "k", $s ); // ? => k
$s = preg_replace( '@\x{013f}@u' , "L", $s ); // ? => L
$s = preg_replace( '@\x{0141}@u' , "L", $s ); // L => L
$s = preg_replace( '@\x{0140}@u' , "l", $s ); // ? => l
$s = preg_replace( '@\x{0142}@u' , "l", $s ); // l => l
$s = preg_replace( '@\x{014a}@u' , "N", $s ); // ? => N
$s = preg_replace( '@\x{0149}@u' , "n", $s ); // ? => n
$s = preg_replace( '@\x{014b}@u' , "n", $s ); // ? => n
$s = preg_replace( '@\x{00d8}@u' , "O", $s ); // Ø => O
$s = preg_replace( '@\x{00f8}@u' , "o", $s ); // ø => o
$s = preg_replace( '@\x{017f}@u' , "s", $s ); // ? => s
$s = preg_replace( '@\x{00de}@u' , "T", $s ); // Þ => T
$s = preg_replace( '@\x{0166}@u' , "T", $s ); // T => T
$s = preg_replace( '@\x{00fe}@u' , "t", $s ); // þ => t
$s = preg_replace( '@\x{0167}@u' , "t", $s ); // t => t
// remove all non-ASCii characters
$s = preg_replace( '@[^\0-\x80]@u' , "", $s );
// possible errors in UTF8-regular-expressions
if (empty($s))
return $original_string;
else
return $s;
}
?>
Вышеупомянутая функция в основном основана на следующей статье: http: // ahinea .com / en / tech / acnted-translate.html