Resultados para ''

Removendo acentuação em Objective C

Escrito por Felipe Barreto em 03/07/10 07:00

Para os programadores brasileiros, a acentuação das strings é um fator importante a ser considerado em vários aspectos do software, como buscas, comparações, ordenações e visualizações. Por isso, em alguns casos pode ser interessante transformar os caracteres acentuados em não acentuados como p. ex. "Meu app é móvel" viraria "Meu app e movel".

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.

Leia também:

Formatador Automático para Objective C

Escrito por Felipe Barreto em 04/05/09 19:55

UPDATE: funcionando agora no Snow Leopard. Verifique a lista de passos da instalação.

Uma das coisas que me incomodam na hora de programar pra iPhone é que o XCode não possui um mecanismo para formatar automaticamente o código como há no Eclipse ou no NetBeans. O máximo que a IDE da Apple permite é tabular automaticamente um trecho de código selecionado. Muito fraco.

Durante a pesquisa, foi difícil escolher o termo certo para encontrar o que eu queria, pois existem diversas variações: code beautifier, formatter, code styler, entre outras.

Finalmente, encontrei o tal do Uncrustify que é um programa de terminal para UNIX - logo, para MAC - e que permite configurar uma série de parâmetros de formatação e aplicar sobre um arquivo de código de diversas linguagens baseadas em C - inclusive Objective C.

"Estou no caminho certo", pensei eu. "Agora só falta aprender a instalar, configurar e fazer o XCode usar o programinha". Depois de penar um pouco, cheguei ao artigo que me colocou na direção que eu esperava. Nem tudo o que foi dito nele funcionou 100% ou está completo, mas foi de grande ajuda para conseguir alcançar o que vou apresentar abaixo.

Baixando e instalando o Uncrustify

  • Faça o download do uncrustify e extraia em qualquer lugar;
  • Abra o arquivo uncrustify.xcodeproj no XCode e dê um Build (Command-B);
  • Update: Para o Snow Leopard, o build acima não funcionou. Ao invés dele, use o Terminal, na pasta do uncrustify:

    $> ./configure
    $> make

  • Volte à pasta onde extraiu o Uncrustify e procure o executável no caminho build/ppc. Update: no Snow Lepard, o executável estará na pasta src.

Agora, como meu conhecimento de UNIX é meio tosco, não garanto que o passo seguinte seja o mais correto, mas funcionou. :D

  • Copie o executável para a pasta /usr/bin (pode ser necessário se autenticar como admin).

Pronto! O Uncrustify está disponível para ser usado por qualquer usuário da máquina.

Criando o arquivo de configuração

Na pasta do Uncrustify, você vai encontrar o arquivo etc/defaults.cfg que possui praticamente todos os parâmetros disponíveis acompanhado de comentários bem explicativos. Mas eles são muitos e configurá-los um por um sem ver o efeito que causam sobre o código é impensável para alguém preguiçoso como eu.

Felizmente, alguém teve a bondade de criar um configurador para diversas ferramentas como o Uncrustify, inclusive o próprio: UniversalIndentGUI.

Esta ferramenta, apesar de ter a interface um pouco tosca e com usabilidade mediana, facilita muito o trabalho, pois permite editar os parâmetros e ver imediatamente o resultado sobre um trecho de código que você pode fornecer e manipular durante a fase de configuração.

Não vou me aprofundar sobre os detalhes desta fase, mas se você não estiver interessado em passar por ela, compartilho aqui o arquivo - ainda em desenvolvimento - com o padrão de código da Mobits.

Usando o arquivo acima, ou gerando o seu próprio, recomendo salvá-lo em /etc/uncrustify/qualquer_coisa.cfg para que esteja disponível para todos os usuários.

Colocando no XCode

Embora o XCode não possua diversas ferramentas comuns em outras IDEs, ele tem um mecanismo simples para adicionar funcionalidades sem muito esforço: os User Scripts.

Uncrustify oara ObjectiveC no XCode

  • Abra a tela de edição dos User Scripts e adicione um Shell Script com nome tipo "Auto Format";
  • Sugiro definir um atalho de teclado, como command-shift-A;
  • Copie o código abaixo para o seu script (renomeie o arquivo de configuração se necessário):
#!/bin/sh
echo -n "%%%{PBXSelection}%%%"
uncrustify -q -l OC -c /etc/uncrustify/mobits-uncrustify.cfg
echo -n "%%%{PBXSelection}%%%"
  • Configure os parâmetros de entrada e saída
    • Input: Entire Document
    • Directory: Selection
    • Output: Replace Document Contents
    • Errors: Display in Alert

Pronto. Agora basta executar o script sobre o código que estiver aberto no momento e apreciar sua beleza. :D

Até a próxima.

Leia também:

  1. Saiba como customizar sua UITableView
  2. Comparação entre as soluções ORM para iPhone
  3. Teste automático de interface para suas Apps de iPhone