03 Jul, 2010 07:00

Removendo acentuação em Objective C

Se você procurar na Internet, vai encontrar as mais diversas abordagens para realizar essa tarefa, desde a pura força bruta (fazendo um find-and-replace por cada caractere acentuado conhecido e substituindo pelo seu equivalente) até abordagens um pouco mais inteligentes. Contudo, poucas são tão simples como a que veremos a seguir.

Para fazer essa transformação, a primeira coisa é entender como o charset que você está usando funciona. Como na grande maioria dos casos usamos UTF-8, me basearei neste padrão para o código que desenvolvi.

Como explica muito bem este artigo, o UTF-8 representa cada caractere com 1 a 4 bytes, enquanto outros padrões como o ASCII e o ISO-8859-1 utilizam apenas 1 byte. O interessante do UTF-8 é que os caracteres acentuados não são nada mais que a união do caractere básico e seu acento (ambos ASCII), como, p. ex., "é" é composto pelos bytes dos caracteres "e" e "'". Somente com este conceito, já fica fácil imaginar qual deve ser a solução.

Basta separarmos os bytes da string, ignorar os bytes dos acentos e juntarmos novamente. E uma forma muito simples de fazer isso é converter sua string para ASCII e depois convertê-la de volta a UTF-8.

Assim:

NSString *minhaString = @"É fácil remover acentos. Até de pingo d'água :D";
NSData *minhaStringAsciiData = [minhaString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *minhaStringSemAcentos =  [[[NSString alloc] initWithData:minhaStringAsciiData encoding:NSUTF8StringEncoding] autorelease];
// minhaStringSemAcentos => "E facil remover acentos. Ate de pingo d'agua :D"

Três observações sobre o código acima. Na segunda linha está o truque principal deste código: allowLossyConversion:YES. Esse parâmetro define que a conversão de UTF-8 para ASCII permitirá que haja uma perda de informação na conversão. Esta perda é justamente a dos bytes que armazenam os acentos, simples não?

A segunda observação é que caracteres que normalmente são usados como acentos, mas em situações em que não são - como o ' em d'agua - não são perdidos pois nestas situações, eles ocupam o byte principal na string UTF-8 e não há perda na conversão.

Finalmente, é importante observar que o código acima funciona apenas para strings comuns na língua portuguesa. Para outros caracteres especiais, pode haver casos de inconsistências. P. ex. caracteres gregos como α, β, etc. são convertidos para caracteres totalmente diferentes ou simplesmente inválidos. Se o seu software espera strings com caracteres mais variados, talvez este código não se aplique e você deva buscar outras soluções.

Ao navegar neste site, você consente o uso de cookies nossos e de terceiros, que coletam informações anônimas e são essenciais para melhorar sua experiência em nosso site.