Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
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?
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.
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?