Помогите с расширенным ASCII/кодированием в PHP!

Добрый вечер.

Это мой код:

static private  function removeAccentedLetters($input){
    for ($i = 0; $i < strlen($input); $i++) {
        $input[$i]=self::simplify($input[$i]);
    }
    return $input;
}
static private function simplify($in){
    $ord=ord($in);
    switch ($ord) {
        case 193: //Á...
        return 'A';
        case 98: //b
        return 'a';
        default:
        return $in;
    }
}

Ok. Это бит, который не работает

case 193: //Á...
  return 'A';

И это бит, который делает:

case 98: //b
return 'a';

Они предназначены только для целей тестирования.

Кто-нибудь может сказать мне, что происходит? Раньше у меня была такая же ошибка, но теперь я не использую какой-либо расширенный ASCII в самом коде, что раньше было причиной ошибки.

Я думаю, что это должно иметь какое-то отношение к кодировке символов, но я не уверен. Кстати, я кодирую в Eclipse и, судя по нему, кодировка символов, которую я использую, — Cp1252.

Да, и да, предполагается, что код удаляет любые буквы с ударением, такие как á à, и заменяет их их основными вогалами, то есть á -> a.

заранее спасибо


person Felipe    schedule 16.09.2010    source источник


Ответы (2)


Может быть, если у вас есть многобайтовые символы, и вы перебираете каждый символ, используя strlen(), чтобы проверить, не зациклились ли вы? strlen() предполагает 1 байт == 1 символ.

Я бы посмотрел на существующие библиотеки транслитерации для PHP.

person alex    schedule 16.09.2010
comment
Это имеет смысл. Есть ли другой способ перебора строки, который не обманет это? - person Felipe; 16.09.2010
comment
@Фелипе Посмотри на mb_strlen(). Тем не менее, я все еще считаю, что вам следует взглянуть на существующие решения. Если вы действительно хотите создать свой собственный, проверьте известный работающий и проанализируйте его. Веселиться! - person alex; 16.09.2010
comment
@Alex: Ваша ссылка на поиск Google не работает. Должно быть: google.com/search?q=php+transliteration. - person MikeSchinkel; 12.10.2010

Возможно, эта функция поможет вам в сочетании с mb_strlen:

mb_strcut или mb_substr

РЕДАКТИРОВАТЬ: Например, вы можете сделать так:

$string = 'cioèòà';
for ($i=0;$i<mb_strlen($string);$i++) {
  echo mb_substr($string, $i, 1);
}

Это повторит вам все одиночные символы.

person enricog    schedule 16.09.2010