Jump to content
filipe3x

Acentos, cedilhas

Recommended Posts

filipe3x

Saudações.

Uma dúvida. Sempre que faço writeFile ou readFile de algo com acentos, aquilo escaxa tudo. Alguém sabe como resolver este problema?

Investiguei um pouco e descobri que se tem que adicionar isto no cabeçalho:

import System.IO.UTF8
import Prelude hiding (readFile, writeFile)
import System.Environment (getArgs)

No entanto, sucede que o ghci me adverte que o "System.IO.UTF8" não existe. Como procedo de modo a mitigar este problema?

Desde já obrigado e um resto de boa noite.

Share this post


Link to post
Share on other sites
filipe3x

Outra dúvida.  ;)

getLines :: FilePath -> IO [string]
getLines = liftM lines . readFile

main = writeFile "nomeficheiro.txt" (getLines "alunos.txt")

No código acima transcrito, como procedo de modo a que o segundo argumento da função writeFile seja do tipo [string] e não do tipo IO [string]?

Obrigado.

Share this post


Link to post
Share on other sites
Baderous

Tens de ir buscar o conteúdo do Monad IO devolvido pela função getLines. Depois tens de passar cada String dessa lista à função appendFile (para ir escrevendo sempre no fim do ficheiro, senão vais fazer overwrite ao que já lá existe).

main :: IO ()
main = do { x <- getLines "alunos.txt";
            writeLines "nomeFicheiro.txt" x
          }

writeLines :: FilePath -> [string] -> IO ()
writeLines _ [] = return ()
writeLines f (h:t) = do { appendFile f h;
                          writeLines f t
                        }

Share this post


Link to post
Share on other sites
filipe3x

Bem, parece que ainda não percebi bem como isto funciona.

Eu tenho o seguinte código:

import Control.Monad

load :: FilePath -> IO [string]
load = liftM lines . readFile

main = do
nomeficheiro<-getLine
load nomeficheiro

Ele funciona, mas se eu adicionar a função map parte (que parte em listas cada string da lista pela vírgula) à função load, ela deixa de funcionar. Dá aquele típico erro de conflito de tipos.

Eu queria colocar assim:

load = map parte . liftM lines . readFile

-------

EDIT: Será devido ao facto da função readFile carregar o ficheiro de um modo lazy? (O map quando lá vai, só tem acesso ao primeiro carácter.)

Share this post


Link to post
Share on other sites
Baderous

Porque o resultado de liftM é um Monad e não uma lista. O map aplica-se a uma lista.

Share this post


Link to post
Share on other sites
Baderous

Tens de extrair o conteúdo do Monad IO, já dei um exemplo em cima de como isso se faz.

Share this post


Link to post
Share on other sites
filipe3x

Pois... é isso. Pensei haver uma forma mais elegante de o fazer, pois esse método obriga a escrever num ficheiro e eu pretendia que a string toda ela fosse atribuída a uma variável.

Share this post


Link to post
Share on other sites
filipe3x

Tenho a seguinte string: "["asdsad","asdasd","asdasd"]"

Quero passar isso para uma lista de Strings, ou seja, ["asdsd","asdasd","asdsad"] através do read. Como faço isso?

Share this post


Link to post
Share on other sites
Baderous

Essa string inicial não é uma string, são 4.

1) "["

2) ","

3) ","

4) "]"

Com lixo no meio (asdads).

Share this post


Link to post
Share on other sites
filipe3x

Eish. 😲

Já vi que está aí um bico-de-obra. Alguma ideia como fazer isso?

Edit: Enganei-me. Afinal as strings estão assim: "['asdsad','asdasd','asdasd']"

E pretendo apenas e somente remover-lhes as aspas que a circundam.

Share this post


Link to post
Share on other sites
HominusNocturna

Eish. 😲

Já vi que está aí um bico-de-obra. Alguma ideia como fazer isso?

Edit: Enganei-me. Afinal as strings estão assim: "['asdsad','asdasd','asdasd']"

E pretendo apenas e somente remover-lhes as aspas que a circundam.

Mas se lhes removeres as aspas irá ficar ['asdsad','asdasd','asdasd'] que dará erro pois segundo o haskell as plicas denotam Char.

Char = 'a', 'b', etc...

String = "asd", "a", etc...

Mas tenho quase a certeza que tu é que te enganaste a copiar o output para aqui.  :D

Share this post


Link to post
Share on other sites
filipe3x

Passa disto: "['asdsad','asdasd','asdasd']"

Para isto: ["'asdsad'","'asdasd'","'asdasd'"]

Como fazer isso?

Share this post


Link to post
Share on other sites
HominusNocturna

Afinal não te enganaste  :D

Eu se pudesse até te ajudava mas tenho o meu projecto a 0 porque também não consigo estruturar o texto de forma que seja perceptível ao Haskell.

E depois também estou com o horrível problema dos "\227" e mesmo alterando a codificação do txt continuo com o mesmo problema.

E no ghc passa-se o seguinte:

Input: "Não és da Sé"

Output: "N\227o \233s da S\233"

Logo não é do encoding do ficheiro.

Também ja andei a importar os packages utf8-string e utf8-light a ver se resolvia e nada.

Share this post


Link to post
Share on other sites
HominusNocturna

Aqui passava-se o mesmo. Tinha o encoding do .csv em ansi. Foi só mudar, et voila.

Diz-me que GHCi e que SO é que estás a utilizar, sff.

Share this post


Link to post
Share on other sites
filipe3x

Tou neste momento com o ghci 6.10.4 e Vista onde os acentos não funcionam. Mas se compilar no linux já dá tudo correctamente.

Share this post


Link to post
Share on other sites
fett2k

estou no ubuntu e o problema ainda me acontece. estou completamente perdido nisto

quando faço System.IO.UTF8.putStrLn "\224" dá lixo, quando uso a do Prelude dá certo. o mesmo para por exemplo \xba (o caractere º).

e alguma sugestão para ao receber \xba de um ficheiro (lido como "\\xba" - ou \227 para "\\227") converter para o dito caractere?

Share this post


Link to post
Share on other sites
filipe3x

Não precisas nada disso! Caga nesses packages.

A solução passa por tanto o .hs como o .csv estarem no encoding UTF-8! Sem isto, nada feito!

Share this post


Link to post
Share on other sites
fett2k

ya também reparei agora que os packages já não fazem diferença. há alguma maneira de a função show também reconhecer os acentos? nela continam a aparecer \227

mas o meu problema agora é converter os ditos \xc3\xa0 para caracteres acentuados. sugestoes?

obrigado!

Share this post


Link to post
Share on other sites
Betovsky

\227 está correcto. \227 é UTF8 para o ã.

Espero que a seguinte sessão de GHCi sirva para perceberem o que está a acontecer.

GHCi, version 6.12.1: http://www.haskell.org/ghc/  :? for help

Loading package ghc-prim ... linking ... done.

Loading package integer-gmp ... linking ... done.

Loading package base ... linking ... done.

Loading package ffi-1.0 ... linking ... done.

Prelude> let s = "ã"

Prelude> show s

"\"\\227\""

Prelude> s

"\227"

Prelude> putStrLn s

ã

Prelude>


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Share this post


Link to post
Share on other sites
fett2k

mais uma vez mto obrigado, mas tenho mais exemplo para talvez acabar de entender o assunto.

o meu objectivo nisto era receber um .csv em que as linhas contêm tanto caracteres acentuados como codigos hex (como \xba), e apresenta-los e gravar com os acentos correctos.

como newbie em haskell a minha soluçao para converter os \x-- foi fazer uma função que nem uma tabela usa, cada caracter deste tipo tem uma linha diferente de conversao:

hex_utf8 "" = ""

hex_utf8 ('\\':a:b:c:t)

    | a == 'x' && b == 'a' && c == '1' = "\225" ++ (hex_utf8 t)

    | a == 'x' && b == 'a' && c == '3' = "\227" ++ (hex_utf8 t)

    | a == 'x' && b == 'a' && c == '7' = "\231" ++ (hex_utf8 t)

    | a == 'x' && b == 'b' && c == 'a' = "\186" ++ (hex_utf8 t)

    | a == 'x' && b == 'c' && c == '2' = "" ++ (hex_utf8 t)

    | a == 'x' && b == 'c' && c == '3' = "" ++ (hex_utf8 t)

hex_utf8 (h:t) = h : (hex_utf8 t)

agora, no ecran, as palavras que li com acentos aparecem com \227 e assim, ao passo que estes chars que converti aparecem devidamente acentuados (estou em ubuntu, todos os ficheiros que estou a usar estão em utf-8). ao gravar num ficheiro, todos os caracteres aparecem acentuados.

ou seja, sobra-me a questão do ecran...

por exemplo, aparece

InsAlu  | "Jo\227o Filipe" | " --------@gmail.com" | "LCC" | "------" | False | False | ['Procura 1º emprego','Interesse pelas áreas temáticas'] | "" | "2009/09/10 17:34:22.134 GMT+1"

vindo de um ficheiro em que está escrito "João" e "Procura 1\xc2\xba emprego" - o acento desaparece, o º aparece. Isto usando uma instancia da funçao show - sem usar o putStrLn.

posso sempre arranjar alternativa com o putStrLn ou parecido, apenas pergunto para tentar entender e fazer um programa mais elegante.

muito obrigado!

Share this post


Link to post
Share on other sites
Betovsky

Se não estás a usar o putStr ou putStrLn então como é que estás a ver a string no ecrã?


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.