Помогите с расширенным ASCII / кодированием в PHP! - PullRequest
1 голос
/ 16 сентября 2010

Добрый вечер, ребята.

Это мой код:

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;
    }
}

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

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

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

case 98: //b
return 'a';

Это только для целей тестирования.

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

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

О, и да, код должен исключать любые акцентированные буквы, такие каки замените их базовыми значениями, например: *> 1018 *

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

Ответы [ 2 ]

2 голосов
/ 16 сентября 2010

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

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

1 голос
/ 16 сентября 2010

Может быть, эта функция поможет вам в сочетании с mb_strlen:

mb_strcut или же mb_substr

РЕДАКТИРОВАТЬ: Например, вы могли бы пойти так:

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

Это перекликает вас всех отдельных персонажей.

...