Acentuação em banco de dados / PHP x Harbour
Moderador: Moderadores
Acentuação em banco de dados / PHP x Harbour
Acabei de ter uma ideia. Vc cria um exemplo simples e tenta reproduzir seu erro. Crie um prg com a mesma codificação que costuma usar. Nesse prg faça um loop simples em uma tabela MySQL. O ideal é que essa tabela seja a única em um banco de testes, não precisa ter muitas linhas. Mas o conteúdo precisa ter acentos. Feito isso nos mande o arquivo prg e o arquivo sql contendo a criação do banco (create table) e os inserts. O conteúdo mostrado deve reproduzir seus erros. Só assim a gente pode te ajudar mesmo, sem soluções mágicas ou balas de prata.
Acentuação em banco de dados / PHP x Harbour
Outra coisa. Se quiser incluir um a arquivo PHP reproduzindo o erro tb seria bom.
Acentuação em banco de dados / PHP x Harbour
Gostei da ideia de mudar tudo pro utf8. Se isso funcionar bem, me disponho a ter esse trabalho.
Mas pra começar a fazer isso, preciso de algumas informações, por favor:
1) O Notepad++ serve para isso? Como já uso ele há muito tempo, seria bom poder continuar com ele;
2) Caso positivo, é só selecionar Encode in UTF-8, como no anexo?
3) Daí é só escrever o .prg e o .php nesse Encode? Vc falou que tem que selecionar hb_cdpselect("utf8"). Mesmo escrevendo nesse Encode vai precisar disso?
4) Na tabela é só mudar o Collate da tabela para UTF-8?
Vou fazer o teste que vc sugeriu e postar daqui a pouco.
Mas pra começar a fazer isso, preciso de algumas informações, por favor:
1) O Notepad++ serve para isso? Como já uso ele há muito tempo, seria bom poder continuar com ele;
2) Caso positivo, é só selecionar Encode in UTF-8, como no anexo?
3) Daí é só escrever o .prg e o .php nesse Encode? Vc falou que tem que selecionar hb_cdpselect("utf8"). Mesmo escrevendo nesse Encode vai precisar disso?
4) Na tabela é só mudar o Collate da tabela para UTF-8?
Vou fazer o teste que vc sugeriu e postar daqui a pouco.
Inacio de Carvalho Neto
Acentuação em banco de dados / PHP x Harbour
Fiz um teste bem simples que demonstra o problema:
1) criei uma tabela com collation utf-8:
2) criei um .prg com Encode UTF-8 no Harbour:
3) criei um .php com UTF-8:
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="Tony Araujo & Jeferson Josias ">
<title>Incluindo teste</title>
<!-- Bootstrap core CSS -->
<link href="/site/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="/site/css/style.css" rel="stylesheet">
</head>
<body>
<?php
include("conexao.php");
$test= $_POST['teste'];
echo "<font face='arial' color='red' size='26'>";
$sql="INSERT INTO teste_acento (teste1) values ('".$test."')";
exqsqlking($sql);
echo "<font size='38'>";
?>
<div class="px-1 py-1 my-1 text-center">
<div class="col-lg-6 mx-auto">
<div class="row gap-1 justify-content-center">
<?php
echo '<a href="testeacentuacao.php" class="btn btn-primary btn-lg col-5 col-xs-5 col-sm-5 col-md-5 col-lg-5 col-xl-5 align-self-center d-flex flex-column justify-content-center align-items-center line-8">Retornar</a>';
?>
</body>
</html>[/code]
Veja o resultado do teste no anexo: o primeiro registro foi feito pelo Harbour, a acentuação ficou correta; o segundo registro foi feito pelo PHP, a acentuação ficou muito errada.
Aproveito para anexar o arquivo do post anterior, que havia esquecido de anexar.
1) criei uma tabela com collation utf-8:
Código: Selecionar todos
CREATE TABLE `teste_acento` (
`teste1` CHAR(50) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
`id` INT(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`) USING BTREE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=3
;Código: Selecionar todos
function main
local cTeste :=space(50)
private us :="I"
cls
@ 5,5 say "Teste:"get cTeste
read
exqado("insert into teste_acento(teste1) values('"+cTeste+"')",3)
return .t.Código: Selecionar todos
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Testando acentuação</title>
</head>
<body style="color: rgb(0, 0, 0); background-color: rgb(255, 204, 153);"
alink="#000099" link="#000099" vlink="#990099">
<form action="testeacentuacao2.php" method="post"> <input type="hidden">
<left>
<table align="left" border="0" cellpadding="0" cellspacing="0"
width="49%" style='height:40px;'>
<font size="38">
<tbody>
<BR>
<tr>
<font size="38">
<label>Digite teste:</label>
<input style="font-size:130px" name="teste">
</tr>
<td> <input style="font-size:130px" name="submit" value=" Enviar " type="submit">
<BR>
<input style="font-size:130px" name="reset" value=" Limpar " type="reset"></td>
</tr>
</tbody>
</table>
</left>
<BR>
<BR>
</form>
</body>
</html>[code]
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="Tony Araujo & Jeferson Josias ">
<title>Incluindo teste</title>
<!-- Bootstrap core CSS -->
<link href="/site/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="/site/css/style.css" rel="stylesheet">
</head>
<body>
<?php
include("conexao.php");
$test= $_POST['teste'];
echo "<font face='arial' color='red' size='26'>";
$sql="INSERT INTO teste_acento (teste1) values ('".$test."')";
exqsqlking($sql);
echo "<font size='38'>";
?>
<div class="px-1 py-1 my-1 text-center">
<div class="col-lg-6 mx-auto">
<div class="row gap-1 justify-content-center">
<?php
echo '<a href="testeacentuacao.php" class="btn btn-primary btn-lg col-5 col-xs-5 col-sm-5 col-md-5 col-lg-5 col-xl-5 align-self-center d-flex flex-column justify-content-center align-items-center line-8">Retornar</a>';
?>
</body>
</html>[/code]
Veja o resultado do teste no anexo: o primeiro registro foi feito pelo Harbour, a acentuação ficou correta; o segundo registro foi feito pelo PHP, a acentuação ficou muito errada.
Aproveito para anexar o arquivo do post anterior, que havia esquecido de anexar.
Inacio de Carvalho Neto
- JoséQuintas
- Administrador

- Mensagens: 20415
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
- Curtiram: 1 vez
Acentuação em banco de dados / PHP x Harbour
Conclusão óbvia: se PHP salvou errado, tem que olhar PHP.
Harbour não tem que mexer em nada, nem no banco de dados, senão vai estragar o que está funcionando.
Harbour não tem que mexer em nada, nem no banco de dados, senão vai estragar o que está funcionando.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Acentuação em banco de dados / PHP x Harbour
Olá, pensei que tivesse desistido.
Vou verificar o que vc postou mas talvez só amanhã mesmo. Vc poderia compactar os seus arquivos do projeto de exemplo? Preciso ter certeza de que estão em utf8. Menos o sql. Só o PHP e prg.
Se quiser postar o sql pode colocar no zip, mas eu quero ter certeza de que o PHP e o prg estão no formato utf8 mesmo.
Vou verificar o que vc postou mas talvez só amanhã mesmo. Vc poderia compactar os seus arquivos do projeto de exemplo? Preciso ter certeza de que estão em utf8. Menos o sql. Só o PHP e prg.
Se quiser postar o sql pode colocar no zip, mas eu quero ter certeza de que o PHP e o prg estão no formato utf8 mesmo.
- JoséQuintas
- Administrador

- Mensagens: 20415
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
- Curtiram: 1 vez
Acentuação em banco de dados / PHP x Harbour
SEM AS SENHAS.
Você já fez isso uma vez, e o acesso daqui é público, todo mundo pode ver, não apenas os usuários cadastrados no fórum, é todo mundo mesmo.
Você já fez isso uma vez, e o acesso daqui é público, todo mundo pode ver, não apenas os usuários cadastrados no fórum, é todo mundo mesmo.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Acentuação em banco de dados / PHP x Harbour
Esse Head do HTML está no formato antigo.
Substitua ele pelo html5
Dentro do Head coloque a TAG meta abaixo:
Código: Selecionar todos
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
Código: Selecionar todos
<!DOCTYPE html>
Código: Selecionar todos
<meta charset="UTF-8">
Acentuação em banco de dados / PHP x Harbour
Um pequeno exemplo
Conclusão: em documentos HTML vc precisa informar no cabeçalho qual o tipo de documento que está sendo enviado para o navegador.
Quando eu sugeri utf8 eu quis dizer que é o padrão mundial e que ele da menos problema. Mas nada impede de vc usar outros padrões de código.
O mais importante é vc entender como funciona e não seguir utf8 só porque é uma tendência. Vc usa o código que achar melhor de acordo com a sua realidade. Sistemas antigos não precisam migrar para utf8, basta fazer as conversões na hora de mandar.
Então temos, no caso do utf8:
1. Todos os Códigos digitados em editor de texto usando o padrão utf8
2. Código HTML , além do item 1,devem ter o utf8 definido no header
3. Banco de dados utf8
4. Harbour com hb_cdpselect("utf8") no início
Código: Selecionar todos
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title of the document</title>
</head>
<Body>
Seu código
</Body>
</html>
Quando eu sugeri utf8 eu quis dizer que é o padrão mundial e que ele da menos problema. Mas nada impede de vc usar outros padrões de código.
O mais importante é vc entender como funciona e não seguir utf8 só porque é uma tendência. Vc usa o código que achar melhor de acordo com a sua realidade. Sistemas antigos não precisam migrar para utf8, basta fazer as conversões na hora de mandar.
Então temos, no caso do utf8:
1. Todos os Códigos digitados em editor de texto usando o padrão utf8
2. Código HTML , além do item 1,devem ter o utf8 definido no header
3. Banco de dados utf8
4. Harbour com hb_cdpselect("utf8") no início
Acentuação em banco de dados / PHP x Harbour
Desisti não. É que às vezes a correria de trabalho aqui não me permite dar sequência logo.
Não tenho conhecimento suficiente para escolher nada; o que me sugerirem que funcione, está ótimo.
Fiz a modificação no php que vc sugeriu, mas ainda assim não funcionou.
Estou postando no anexo o .prg, o .php e o .sql. Agradeço toda ajuda nisto, já faz tempo que estou tentando resolver este problema.
Não tenho conhecimento suficiente para escolher nada; o que me sugerirem que funcione, está ótimo.
Fiz a modificação no php que vc sugeriu, mas ainda assim não funcionou.
Estou postando no anexo o .prg, o .php e o .sql. Agradeço toda ajuda nisto, já faz tempo que estou tentando resolver este problema.
- Anexos
-
php.zip- (1.32 KiB) Baixado 266 vezes
-
teste_acentuacao.zip- (334 Bytes) Baixado 299 vezes
-
teste.zip- (846 Bytes) Baixado 293 vezes
Inacio de Carvalho Neto
Acentuação em banco de dados / PHP x Harbour
Deu esse erro
Tem tb um arquivo conexao.php que não veio.
Código: Selecionar todos
Fatal error: Uncaught Error: Call to undefined function exqsqlking()
Acentuação em banco de dados / PHP x Harbour
De qualquer modo eu retirei as chamadas que não vieram e apenas imprimi o sql e deu certo :
Eu digitei a string "áéíóúçÃ" e ele imprimiu corretamente:
Então até aqui não vi erro algum. Pode ser nessas funções que não vieram.
Código: Selecionar todos
//include("conexao.php"); //<------- Comentei aqui
$test= $_POST['teste'];
echo "<font face='arial' color='red' size='26'>";
$sql="INSERT INTO teste_acento (teste1) values ('".$test."')";
echo $sql; <---------------------- Imprimiu corretamente
//exqsqlking($sql); <----- E aqui
Código: Selecionar todos
INSERT INTO teste_acento (teste1) values ('áéíóúçÃ')
Acentuação em banco de dados / PHP x Harbour
Achei esse link aqui que creio que é a resposta.
https://stackoverflow.com/questions/462 ... -php-mysql
Segundo o link o problema é na função do PHP que faz a conexão. Essa função que vc usa é antiga demais, e vc precisa informar que está usando utf-8
Uma curiosidade que talvez ajude. A função abaixo retorna o encode que a sua conexão utiliza :
Ela pode ser útil caso vc precise mandar strings em outros formatos como ISO. Vc usa essa função em tempo de desenvolvimento para ver se está ok.
https://stackoverflow.com/questions/462 ... -php-mysql
Segundo o link o problema é na função do PHP que faz a conexão. Essa função que vc usa é antiga demais, e vc precisa informar que está usando utf-8
Código: Selecionar todos
$conn = mysql_connect($server, $username, $password);
mysql_set_charset("UTF8", $conn);
Código: Selecionar todos
echo mysql_client_encoding($conn);
Acentuação em banco de dados / PHP x Harbour
Como eu sei que vc usa mysql_connect() ?
Fiz uma busca no google pela função exqsqlking() e o google me retornou esse link abaixo com uma postagem sua onde vc mostra o fonte dela
https://pctoledo.org/forum/viewto ... 28&t=19382
Se vc não mudou nada nos últimos anos então deve colocar a função mysql_set_charset. Faça as alterações que eu coloquei no post anterior e testa.
Se não der certo coloca o resto do fonte para eu ver aqui amanhã.
Fiz uma busca no google pela função exqsqlking() e o google me retornou esse link abaixo com uma postagem sua onde vc mostra o fonte dela
https://pctoledo.org/forum/viewto ... 28&t=19382
Se vc não mudou nada nos últimos anos então deve colocar a função mysql_set_charset. Faça as alterações que eu coloquei no post anterior e testa.
Se não der certo coloca o resto do fonte para eu ver aqui amanhã.
Acentuação em banco de dados / PHP x Harbour
Acho que vc realmente matou a charada!
Acresci a linha mysql_set_charset("UTF8", $conn); na exqsqlking, e o teste já funcionou.
Testei também em uma outra página que já tinha e que também dava problema, agora funcionou bem.
Ainda não testei em todas as páginas, mas parece que isso resolveu totalmente e facilmente o problema.
Muito obrigado.
Acresci a linha mysql_set_charset("UTF8", $conn); na exqsqlking, e o teste já funcionou.
Testei também em uma outra página que já tinha e que também dava problema, agora funcionou bem.
Ainda não testei em todas as páginas, mas parece que isso resolveu totalmente e facilmente o problema.
Muito obrigado.
Inacio de Carvalho Neto

