Неважно, решил это. критически важно , чтобы ваш RealProxy
производный класс вызывал базовый конструктор с проксируемым типом. В моем случае:
public class MyProxy<T> : RealProxy
{
public MyProxy()
: base(typeof(T)) // this was missing
{
...
}
...
}
Я думаю, проблема здесь в том, что ваши кодировки рассматривают ä и å как разные символы по сравнению с 'a'. Фактически, документация PHP для strtr предлагает образец для удаления акцентов уродливым способом: (
Одна из уловок, на которую я наткнулся в Интернете, заключалась в использовании htmlentities с последующим удалением закодированного символа:
$stripped = preg_replace('`&[^;]+;`','',htmlentities($string));
Не идеально, но в некоторых case.
Но вы пишете о создании строки URL, поэтому urlencode и его аналог urldecode могут быть лучше. Или,
Я согласен с комментарием Джорджброка.
Если вы найдете способ заставить // TRANSLIT работать, вы можете создать удобные URL-адреса:
$ url = preg_replace ('/ (\ w) [^ \ w \ s] (\ w) /', '$ 1 $ 2', $ url) ;
$ url = preg_replace ('/ [^ a-z0-9] + /', '-', $ url);
$ url = preg_replace ('-'
, например '/ (?: (^ | \ -) \ - + | \ - $) /', '', $ url);
Если вы не можете заставить его работать, замените setp 1 заменой на основе strtr / символов, как решение Xetius.
Я не могу воспроизвести вашу проблему. Я получаю ожидаемый результат.
Как именно вы используете mb_detect_encoding ()
, чтобы убедиться, что ваша строка на самом деле является UTF-8?
Если я просто позвоню mb_detect_encoding ($ input)
для версий вашей строки в кодировке UTF-8 и ISO-8859-1, оба возвращают «UTF-8», так что эта функция не особенно надежна.
iconv ()
дает мне "уведомление" PHP, когда он получает неверно закодированную строку и отображает только "F", но это может быть просто из-за разных настроек / версий PHP / iconv (?).
Я предлагаю вам попробовать позвонить mb_check_encoding ($ input, "utf-8")
сначала убедитесь, что ваша строка действительно является UTF-8. Думаю, что нет.
Вы можете использовать urlencode. Не совсем выполняет то, что вы хотите (убирает акценты), но дает вам строку, пригодную для использования в URL
$output = urlencode ($input);
В Perl я мог бы использовать регулярное выражение для перевода, но я не могу вспомнить эквивалент PHP
$input =~ tr/áâàå/aaaa/;
и т. Д.
вы можете сделать это с помощью preg_replace
$patterns[0] = '/[á|â|à|å|ä]/';
$patterns[1] = '/[ð|é|ê|è|ë]/';
$patterns[2] = '/[í|î|ì|ï]/';
$patterns[3] = '/[ó|ô|ò|ø|õ|ö]/';
$patterns[4] = '/[ú|û|ù|ü]/';
$patterns[5] = '/æ/';
$patterns[6] = '/ç/';
$patterns[7] = '/ß/';
$replacements[0] = 'a';
$replacements[1] = 'e';
$replacements[2] = 'i';
$replacements[3] = 'o';
$replacements[4] = 'u';
$replacements[5] = 'ae';
$replacements[6] = 'c';
$replacements[7] = 'ss';
$output = preg_replace($patterns, $replacements, $input);
(обратите внимание, что это было набрано в пятницу после полудня, когда запомнилось туманное пиво, поэтому это может быть не на 100% правильным)
или вы можете создать хеш-таблицу и выполнить замену на основе это.