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: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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 258 vezes
-
teste_acentuacao.zip- (334 Bytes) Baixado 291 vezes
-
teste.zip- (846 Bytes) Baixado 285 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

