Clipper On Line • Ver Tópico - Dúvida com Acentuação em Mysql
Página 1 de 2

Dúvida com Acentuação em Mysql

MensagemEnviado: 18 Mai 2022 17:25
por rossine
Olá,

Estou tentando subir dados acentuados através de JSON via CURL e não estou conseguindo

   cJson   := hb_jsonEncode( { "Tema" => "Legislação de Trânsito" }, .F. )

   cJson   := hb_StrToUTF8( cJson )

   aadd( aHeader, "Content-Type: application/json; charset=utf-8" )



e Está gravando no BD assim:

LegislaþÒo de TrÔnsito


Minha Tabela foi criada assim:

 ENGINE=InnoDB DEFAULT CHARSET=utf8_general_ci;


Talvez sem UTF-8 ficasse mais fácil, como seria ?

Alguém saberia me dizer o que fazer ?

Dúvida com Acentuação em Mysql

MensagemEnviado: 19 Mai 2022 10:07
por Mario Mesquita
Bom dia.

Será que não falta essas declarações no seu programa?

REQUEST HB_CODEPAGE_UTF8EX, HB_CODEPAGE_PT850, HB_CODEPAGE_PTISO, HB_LANG_PT
hb_cdpSelect( "UTF8EX" )


Saudações,
Mario.

Dúvida com Acentuação em Mysql

MensagemEnviado: 19 Mai 2022 17:02
por rossine
Olá Mário,

Primeiramente obrigado pela sugestão :)

Eu consegui resolver setando as configurações abaixo:

   aMsg := { }

   aadd( aMsg, hHash )

   cJson   := hb_jsonEncode( aMsg, .F. )

   cJson   := hb_StrToUTF8( win_AnsiToOem( cJson ) )    // Sem isto a acentuação fica errada

   aHeader := { }

   aadd( aHeader, "Content-Type: application/json" )
   aadd( aHeader, "charset=utf-8" )  // Sem isto a acentuação fica errada
...
      curl_easy_setopt( hCurl, HB_CURLOPT_POSTFIELDS, cJson )

      curl_easy_setopt( hCurl, HB_CURLOPT_HTTPHEADER, aHeader )
...


Obrigado,

Dúvida com Acentuação em Mysql

MensagemEnviado: 19 Mai 2022 17:25
por JoséQuintas
Sei lá... cada um tem seu jeito...

O que fez foi modificar tudo pra mesma codepage, UTF-8.
Poderia remover tudo, e deixar em ANSI, desde que estivesse configurado igual em tudo.
Não sei pra que complicar com UTF-8.

Dúvida com Acentuação em Mysql

MensagemEnviado: 20 Mai 2022 09:06
por Mario Mesquita
Bom dia a todos.

Se entendi o que li, ele definiu a base de dados pra UTF-8. Aí obriga a salvar tudo assim.

Nos meus ensaios com MySql, criei as bases assim. Funciona mas realmente é chato pra caramba. A única vantagem aparente é se for usar essa base em serviço de internet. Pra intranet não vejo vantagem alguma, me corrijam se falei bobagem.

Saudações,
Mario.

Dúvida com Acentuação em Mysql

MensagemEnviado: 20 Mai 2022 14:45
por JoséQuintas
UTF-8 é para o mundo enxergar o mundo.

Sou brasileiro, meu aplicativo é brasileiro, e é usado por brasileiros.
Então... não faz sentido usar codepage diferente de pt-br.

Mesmo internet, não precisa ser UTF-8, mas tudo caminhou pra isso, pra padronizar.

Nada contra, exceto o fato de um caractere poder ser representado por vários caracteres, o que deixa tudo com tamanho variável, e é de se imaginar também mais lento.

Mas se é pra ficar usando funções de conversão.... mais fácil usar só quando mexer com UTF-8, e não o tempo todo.

http://www.jpatecnologia.com.br/

Meu site é em ASP, pt-br, usando banco de dados MySQL em pt-br.
Sei lá se fica errado em algum país fora do Brasil.

Dúvida com Acentuação em Mysql

MensagemEnviado: 20 Mai 2022 14:53
por JoséQuintas
Aproveitando...

Quando fui definir codepage para o aplicativo e banco de dados...
Na época ainda mexia alguma coisa em Visual Basic 6.

Comparei o VB6, o Harbour, o site, o MySQL, editor de textos, bloco de notas, editor do Visual Basic, etc. se tudo ficava igual, respeitando a codepage.
Quando tudo ficou igual, foi isso que adotei PT-ISO no Harbour.
Certo? Errado? Sei lá.... tá funcionando igualzinho em todos, não vejo porque considerar errado.

Dúvida com Acentuação em Mysql

MensagemEnviado: 20 Mai 2022 15:16
por Itamar M. Lins Jr.
Olá!
UTF-8 é para o mundo enxergar o mundo.

Não é apenas isso.
Tem SIMBOLOS LEGAIS! Aquelas CARINHAS... AVIÃOZINHO... rsrsrsrs

Saudações,
Itamar M. Lins Jr.

Dúvida com Acentuação em Mysql

MensagemEnviado: 20 Mai 2022 15:24
por Itamar M. Lins Jr.
Olá!
Se desejar colocar nos relatórios em HTML, tá na mão!
Imagem
Imagem
Imagem

<html>
&#9787;   &#9786; &#9785;   &#9792;   &#9794; &#9992; &#9731;   
</html>

Salvar como icons.html e abrir no navegador.
Captura de tela 2022-05-20 153834.png

Saudações,
Itamar M. Lins Jr.

Dúvida com Acentuação em Mysql

MensagemEnviado: 24 Mai 2022 17:15
por rossine
Olá,

Usando UTF-8 aqui não está 100%, então estou tentando usar o padrão Ansi mesmo.

Quando envio o comando:

   hHash := { "Sql" => "INSERT INTO Temas ( ID_Tema, Descricao ) VALUES ( 'TEMA_0001', 'Legislação de Trânsito' )" }

   aMsg := { }

   aadd( aMsg, hHash )

   cJson   := hb_jsonEncode( aMsg, .F. )

//   cJson   := hb_StrToUTF8( win_AnsiToOem( cJson ) ) // Usando isto executa o comando dentro do PHP mas a acentuação fica errada

   aHeader := { }

   aadd( aHeader, "Content-Type: application/json" )
//   aadd( aHeader, "charset=latin1" )        tentei isto e não funcionou
//   aadd( aHeader, "charset=iso-8859-1" ) tentei isto e não funcionou

   hCurl := curl_easy_init()

   if !empty(hCurl)
      curl_easy_setopt( hCurl, HB_CURLOPT_VERBOSE, .F. )
      curl_easy_setopt( hCurl, HB_CURLOPT_CUSTOMREQUEST, "POST" )
      curl_easy_setopt( hCurl, HB_CURLOPT_POSTFIELDS, cJson )
...


na entrada do PHP, quando interpreta a linha de comando:

 $parametros = json_decode( file_get_contents( "php://input" ) ) ;


ocorre o erro:

INSERT INTO Temas ( ID_Tema, Descricao ) VALUES ( 'TEMA_0001', 'Legislação de Trânsito' )

Malformed UTF-8 characters, possibly incorrectly encoded\n"


O que pode estar errado ?

Meu arquivo index.php no servidor está definido assim:

Como estou iniciando o desenvolvimento em PHP, não sei se isto tem a ver.

<head>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>

Dúvida com Acentuação em Mysql

MensagemEnviado: 24 Mai 2022 22:27
por JoséQuintas
A mensagem de erro do PHP é que os caracteres não estão em UTF-8.
Só pode significar que o PHP está configurado pra UTF-8, e o que está configurando é o HTML e não o PHP.

Dúvida com Acentuação em Mysql

MensagemEnviado: 25 Mai 2022 08:06
por Itamar M. Lins Jr.
Olá!
Malformed UTF-8 characters, possibly incorrectly encoded\n"


<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8">
</head>

<body>
<h1>My Website</h1>
<p>Some text...</p>
</body>

</html>

O padrão acredito que seja UTF-8 no MySQL/MariaDb e no PHP. No HTML para os navegadores se não tiver nada(sem a tag meta charset) é UTF-8 em META CHARSET.

Seu EDITOR DEVERÁ estar em UTF-8 também.
Já fiz alguns testes com Harbour e os acentos precisam do UTF8EX(Extendido) como página de código.

Saudações,
Itamar M. Lins Jr.

Dúvida com Acentuação em Mysql

MensagemEnviado: 25 Mai 2022 15:08
por rossine
Olá,

O Problema ocorre na entrada da execução do programa em PHP:

    $parametros = json_decode( file_get_contents( "php://input" ) )

    $cClasse  = $parametros[0]->cClasse;
    $cMetodo = $parametros[0]->cMetodo;
    $cSql       = $parametros[0]->cSql;


Quando eu envio um Hash que tenha algum elemento com acentuação:


[ {"cTabela":"Temas","cOper":"POST","cSql":"INSERT INTO Temas ( ID_Tema, Descricao ) VALUES ( 'TEMA_0001', 'Legislação de Trânsito' )"}]



A variável "$parametros" não recebe nada, é aqui que está o problema, não sei porque.
Já salvei todos os arquivoos .php , .html no formato "uft8" e subi estes arquivos, mudei o index.php para

<meta http-equiv="Content-Type" content="text/html; charset=utf8" />


...mas não vai, tem algo errado ainda.

O Hash passado para o programa quando não tem acentuação, funciona.

Mais alguma sugestão ?

Obs:
- Tentei refazer aqui com padrão "iso-8859-1" e "latin1" mas não vai também.
- Tentei também setando: HB_CDPSelect( "UTF8EX" ) e não dá certo.

Obrigado,

Dúvida com Acentuação em Mysql

MensagemEnviado: 25 Mai 2022 16:09
por rossine
Olá,

Na função hb_jsonEncode() tem como passar o CodePage:

   cJson   := hb_jsonEncode( aMsg, .F., "UTF8EX" )


Nas definições dos parâmetros passados para a "Curl", faço assim:

   aHeader := { }
...
   aadd( aHeader, "Content-Type: application/json" )
   aadd( aHeader, "charset=utf8" )
...


Passando este parâmetro "UTF8EX", não ocorre mais erros, mas a acentuação no Banco de Dados fica errada ainda:


LegislaþÒo de TrÔnsito
SinalizaþÒo de TrÔnsito
DireþÒo Defensiva
Primeiros Socorros
Meio Ambiente e Cidadania
MecÔnica bßsica de VeÝculos


Dúvida com Acentuação em Mysql

MensagemEnviado: 25 Mai 2022 16:47
por Itamar M. Lins Jr.
Olá!
Passando este parâmetro "UTF8EX", não ocorre mais erros, mas a acentuação no Banco de Dados fica errada ainda:


Não está misturando as coisas ?

No HTML a tag META CHARSET="UTF-8"
No Harbour é ... Xô vê aqui...
REQUEST HB_CODEPAGE_UTF8
Function Main
hb_cdpSelect( "UTF8EX" )

No Html colocar
!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>


No banco de dados, deve configurar ai p/ UTF-8.
https://codigofonte.org/configurando-padroes-unicode-para-mariadb-ou-mysql/
É do conhecimento comum que os padrões do MySQL foram escolhidos sob forte influência de drogas, é basicamente por isso que eles são tão aleatórios e ruins. MariaDB também herda principalmente esses, devido à compatibilidade com versões anteriores. Ou talvez, você sabe, porque usar drogas enquanto programando é simplesmente divertido.


Saudações,
Itamar M. Lins Jr.

Dúvida com Acentuação em Mysql

MensagemEnviado: 25 Mai 2022 17:13
por rossine
Olá Itamar,

Minhas variáveis aqui estão assim:

Variable_name    Value    
character_set_client    utf8mb4
character_set_connection    utf8mb4
character_set_database    utf8
character_set_filesystem    binary
character_set_results    utf8mb4
character_set_server    latin1
character_set_system    utf8
character_sets_dir    /usr/share/mysql/charsets/
collation_connection    utf8mb4_unicode_ci
collation_database    utf8_unicode_ci
collation_server    latin1_swedish_ci


Repare que "character_set_server" = "latin1" e "collation_server" = "latin1_swedish_ci", talvez possa ser isto.
Vou ver se tem como mudar isto.
Estou usando um servidor externo, não é local não.

Dúvida com Acentuação em Mysql

MensagemEnviado: 25 Mai 2022 17:40
por rossine
Olá,

Sim, está assim:
<!DOCTYPE html>
<html>
<head>
   <title>Teste</title>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
   <link rel="icon" href="images/qi.ico">
</head>
<body>
   <div class="corpo" style="color: rgb( 255,255,244) ; background-color: rgb( 0,0,255); text-align: center;">
      <h1>Página principal</h1>
   </div>
</body>
</html>


Eu colocando ou não esta linha, não muda nada
hb_cdpSelect( "UTF8EX" )


Eu uso isto na passagem dos valores dentro do JSON:

cJson   := hb_jsonEncode( aMsg, .F., "UTF8EX" )


Mudei meu servidor aqui:

Executando os comandos:

set global character_set_server = utf8;
set global character_set_database = utf8;
set global collation_server = utf8_unicode_ci;
set global character_set_client =utf8;
set global character_set_connection=utf8;
set global character_set_results=utf8;


agora ficou assim:


show variables like 'collation%';

collation_connection    utf8mb4_unicode_ci
collation_database    utf8_unicode_ci
collation_server    utf8_unicode_ci

show variables like '%character%';

character_set_client    utf8mb4
character_set_connection    utf8mb4
character_set_database    utf8
character_set_filesystem    binary
character_set_results    utf8mb4
character_set_server    utf8
character_set_system    utf8
character_sets_dir    /usr/share/mysql/charsets/



Mas ainda recebendo acentuação errada:

MecÔnica bßsica de VeÝculos

Dúvida com Acentuação em Mysql

MensagemEnviado: 25 Mai 2022 18:35
por Itamar M. Lins Jr.
Olá!
Tá errado ai no html tem " sobrando.
https://www.w3schools.com/tags/att_meta_charset.asp
<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8">
</head>

<body>
<h1>My Website</h1>
<p>Some text...</p>
</body>

</html>


Simplifica ai a linha->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />


Saudações,
Itamar M. Lins Jr.

Dúvida com Acentuação em Mysql

MensagemEnviado: 25 Mai 2022 18:55
por Itamar M. Lins Jr.
Olá!
Peguei aqui seu texto em html, está ok.
Deve ser depois que grava no BD, que está, ou gravando errado ou lendo do BD convertendo errado.
Ou no editor que não deve estar UTF-8.

Saudações,
Itamar M. Lins Jr.

Dúvida com Acentuação em Mysql

MensagemEnviado: 25 Mai 2022 21:42
por rossine
Olá,

Consegui resolver da seguinte maneira:

   cJson   := hb_jsonEncode( aMsg, .F. ) // , "UTF8EX" ) <- Tirei esta referencia


e inclui no arquivo .PHP a função "utf8_encode()" :

    $parametros = json_decode( utf8_encode( file_get_contents( "php://input" ) ) ) ;


Com isto a acentuação ficou gravada no BD corretamente e também retornada corretamente para meu sistema em harbour:

Legislação de Trânsito
Sinalização de Trânsito
Direção Defensiva
Primeiros Socorros
Meio Ambiente e Cidadania
Mecânica básica de Veículos


Obrigado pela ajuda de todos.