euMesmo2 0 Denunciar post Postado Julho 19, 2011 Desenvolvi a seguinte função para substituir os caracteres especiais do html pelos respectivos caracteres em strings: const int numHTMLSpecialChars = 29; const char* HTMLSpecialChars[][2] = { { "<", "<" }, { ">", ">" }, { "&", "&" }, { "á", "á" }, { "â", "â" }, { "à", "à" }, { "ã", "ã" }, { "ç", "ç" }, { "é", "é" }, { "ê", "ê" }, { "í", "í" }, { "ó", "ó" }, { "ô", "ô" }, { "õ", "õ" }, { "ú", "ú" }, { "ü", "ü" }, { "Á", "Á" }, { "Â", "Â" }, { "À", "À" }, { "Ã", "Ã" }, { "Ç", "Ç" }, { "É", "É" }, { "Ê", "Ê" }, { "Í", "Í" }, { "Ó", "Ó" }, { "Ô", "Ô" }, { "Õ", "Õ" }, { "Ú", "Ú" }, { "Ü", "Ü" } }; void removeHTMLSpecialChars(char* str) { char* ptr; int a; int dif; for (a = 0; a < numHTMLSpecialChars; a++) { while (1) { ptr = strstr(str, HTMLSpecialChars[a][0]); if (ptr == NULL) { break; } strcpy(ptr, HTMLSpecialChars[a][1]); dif = strlen(HTMLSpecialChars[a][0]); if (dif == 0) { continue; } strcpy(ptr + strlen(HTMLSpecialChars[a][1]), ptr + dif); printf("%s\n", str); //So p/ testar } } } int main(int argc, char* argv[]) { char teste[80]; strcpy(teste, "áténção"); FILE* file; removeHTMLSpecialChars(teste); file = fopen("teste", "a"); fprintf(file, "%s\n", teste); fclose(file); } Bom, quando rodo o programa, ele responde: áténçãoáténção áténção áténção Era o esperado, mas no arquivo "teste" a resposta e diferente: áténção Creio que o problema seja devido à codificação do arquivo de texto. Como fazer com que o programa imprima os caracteres corretamente no arquivo de texto? Obrigado Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 19, 2011 Pelo resultado aqui na minha máquina, a resposta pode ser o LOCALE do seu ambiente, já que eu vejo e escrevo os acentos numa boa. Se eu executar o comando locale no meu terminal, todas variáveis estão definidas como pt_BR.utf-8 (inclusive a LANG), menos o LC_ALL. É windows? Compartilhar este post Link para o post Compartilhar em outros sites
euMesmo2 0 Denunciar post Postado Julho 20, 2011 Não, estou utilizando fedora linux Quanto ao locale: $ locale LANG=pt_BR.utf8 LC_CTYPE="pt_BR.utf8" LC_NUMERIC="pt_BR.utf8" LC_TIME="pt_BR.utf8" LC_COLLATE="pt_BR.utf8" LC_MONETARY="pt_BR.utf8" LC_MESSAGES="pt_BR.utf8" LC_PAPER="pt_BR.utf8" LC_NAME="pt_BR.utf8" LC_ADDRESS="pt_BR.utf8" LC_TELEPHONE="pt_BR.utf8" LC_MEASUREMENT="pt_BR.utf8" LC_IDENTIFICATION="pt_BR.utf8" LC_ALL= Assim como o seu, pelo visto. Bom, reiniciei o computador e executei o programa novamente. Surpreendentemente, ele retornou o resultado correto tento no terminal, quanto no documento salvo. Bom, rodei o programa novamente, mas agora com o programa principal, que fazia algumas outras tarefas. Ele editou o arquivo "teste" e , como de costume, cliquei no botão reverter do gedit. Então ele retornou: Não foi possível reverter o arquivo /home/Yago/teste. Erro inesperado: Invalid UTF-8 sequence in input Creio que o problema esteja na codificação das strings que são inseridas no arquivo durante a execução do programa. Existe algum meio de definir a codificação das strings impressas no arquivo? Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 24, 2011 Como eu não consigo reproduzir o problema, o que dá p/ fazer é pedir p/ você dar uma lida no man 7 utf8. Tem uns pedaços de informação interessantes por lá: Users have to select a UTF-8 locale, for example with export LANG=en_GB.UTF-8 in order to activate the UTF-8 support in applications. Application software that has to be aware of the used character encoding should always set the locale with for example setlocale(LC_CTYPE, "") and programmers can then test the expression strcmp(nl_langinfo(CODESET), "UTF-8") == 0 to determine whether a UTF-8 locale has been selected and whether therefore all plaintext standard input and output, terminal communication, plaintext file content, filenames and environment variables are encoded in UTF-8. http://www.cprogramming.com/tutorial/unicode.html http://www.gnu.org/s/hello/manual/libc/Representation-of-Strings.html Se alguma dessas coisas funcionar p/ você, dê um toque por aqui. Compartilhar este post Link para o post Compartilhar em outros sites