Num destes dias me deparei com uma tarefa bem interessante: criar arquivos individuais (formato ASCII), cujos nomes sao compostos de strings retirados dos dados lidos. Neste caso especifico, os dados eram as coordenadas espaciais dos limites municipais dos municipios do Estado de Sao Paulo.Estes dados estao disponiveis para download no site do IBGE e estao no formato shapefile, que e um formato de dados vetoriais geoespaciais. O NCL suporta a leitura deste tipo de arquivo e varios exemplos estao disponiveis em http://www.ncl.ucar.edu/Applications/shapefiles.shtml. Logo colocarei um exemplo bem pratico aqui.O ponto principal e motivador deste "post" e que os nomes dos municipios, nestes arquivos, estao acentuados. Do ponto de vista de exibicao do nome nao ha nenhum problema. Entretanto, quanto tenta-se automatizar a procura de algum municipio ou a geracao de arquivos com as suas coordenadas limites, tendo seu nome como o nome do arquivo, as coisas complicam. Por padrao, o NCL nao aceita caracteres acentuados (veja mais sobre isso em um post anterior).Portanto, faz-se necessario um tratamento previo das strings com o nome dos municipios antes de usa-los apropriadamente. Como a dor ensina a gemer tive que me virar para resolver este probleminha. A solucao: comparar os valores decimais dos caracteres (tabela ASCII/ANSI) e substitui-los pelos mesmos caracteres sem acento.Abaixo esta uma funcao que criei para isto:undef("ansi2ascii")function ansi2ascii( string1:string )local dummy,idxANSI,dimsANSI,ibegin; quebra a string passada a funcao; em um arranjo unidimensional de; caracteresdummy = chartoint( stringtochar( string1 ) ) ; indices da tabela ANSI (ASCII extendido) com os valores; correspondentes aos caracteres acentuados; neste arranjo, tem-se, para cara linha:; coluna 0 => indice inferior; coluna 1 => indice superior; coluna 2 => indice do caracter substitutivoidxANSI = (/ (/192,197,65/),\ ; caractere A(/200,203,69/),\ ; caractere E(/204,207,73/),\ ; caractere I(/210,214,79/),\ ; caractere O(/217,220,85/),\ ; caractere U(/224,229,97/),\ ; caractere a(/232,235,101/),\ ; caractere e(/236,239,105/),\ ; caractere i(/242,246,111/),\ ; caractere o(/249,252,117/),\ ; caractere u(/199,199,67/),\ ; caractere C(/231,231,99/),\ ; caractere c(/209,209,78/),\ ; caractere N(/241,241,110/),\ ; caractere n(/39,39,32/) /) ; caractere ' (apostrofo); dimensoes do arranjo com codigos ASCII/ANSI.dimsANSI = dimsizes( idxANSI )do i = 0, dimsANSI(0)-1; substitui os caracteres acentuados de acordo com os; codigos passados no arranjo idxANSIdummy = where( dummy.ge.idxANSI(i,0) .and. dummy.le.idxANSI(i,1),\idxANSI(i,2), dummy )end do; converte o arranjo unidimensional de caracteres a uma stringRESULT = chartostring( inttochar( dummy ) ); retorna a stringreturn( RESULT )endSuponha que, lendo o conteudo de um arquivo, obtem-se uma string contendo: "NCL nao aceita acentuacao". Esta string e colocanda numa variavel myString. Aplicando a funcao acima neste variavel:myStr = ansi2ascii( myString )resultara no conteudo "NCL nao aceita acentuacao" para a variavel myStr. O conteudo desta nova variavel pode ser manipulado normalmente dentro do NCL.A funcao utiliza indices inferior e superior para cada caractere. Isto porque a tabela ANSI esta organizada de uma forma que todas as acentuacoes em um dado caractere estao dispostas sequencialmente. Veja o caso dos caracteres A acentuados: A=192; A=193; A=194; A=195; A=196; A=197.Usando isto em favor proprio, basta verificar se o codigo decimal ANSI de um dos caracteres da string analisada encontra-se entre 192 e 197. Caso positivo, substitui-se seu valor por 65, o codigo ASCII do