Clipper On Line • Ver Tópico - UTF-8

UTF-8

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

UTF-8

Mensagempor JoséQuintas » 12 Jan 2021 01:38

hmgextended.png


Sei lá... tanta coisa sobre UTF-8, e aí acontece isso.
E aí?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

UTF-8

Mensagempor JoséQuintas » 12 Jan 2021 01:52

Então... é nessas horas que eu pergunto:
Vale a pena abandonar o tradicional ANSI ?
Se nem o Windows se entende com essas coisas...

O curioso é que isso veio compactado, foi descompactado, mas agora não quer compactar.
Talvez porque usei o 7-zip, que não é igual o ZIP que é do Windows, mas....
Isso já impede de zipar a HMG pelos meios normais.

Talvez no Windows 11..... kkkkk
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

UTF-8

Mensagempor Mario Mesquita » 13 Jan 2021 17:38

Boa tarde, pessoal.

Aproveitando o post, gostaria de uma ajuda.

Eu tenho uma tabela DBF de um programa feito em HMG 3.0.46, alguns campos com letras acentuadas. A configuração de idioma está "REQUEST HB_LANG_PT" e
"HB_LangSelect("PT")".

Meu problema é que fiz um programa com o HMG 3.4.4 Unicode com fontes em UTF-8 e tenho que ler essa tabela pra gerar um arquivo. O programa está com "REQUEST HB_CODEPAGE_UTF8EX" e
"hb_cdpSelect("UTF8EX")".

Vendo vários posts, entendi que tenho que fazer uma conversão para ele pegar essas letras com acento, mas não está dando certo.

Usei "HB_StrToUTF8()" e "HB_AnsiToOem()" mas não funcionou. Devo estar fazendo algo errado. Não sei o quê.

Se alguém souber, agradeço.

Saudações,
Mario.
Avatar de usuário

Mario Mesquita
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 557
Data de registro: 08 Dez 2009 12:47
Cidade/Estado: Rio de Janeiro
Curtiu: 73 vezes
Mens.Curtidas: 13 vezes

UTF-8

Mensagempor Itamar M. Lins Jr. » 13 Jan 2021 19:04

Olá!
Vale a pena abandonar o tradicional ANSI ?


Vai ficar para traz, pq todo mundo está usando UTF8 até a Microsoft, ninguém usa mais ansi, é tudo UTF8. Essas coisas antigas, só para compatibilidade.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

UTF-8

Mensagempor Kapiaba » 13 Jan 2021 19:08

Tente:

   cStr := HB_StrToUTF8( TXTdesc, "PT" )


Abs.
Kapiaba
Colaborador

Colaborador
 
Mensagens: 1765
Data de registro: 07 Dez 2012 15:14
Cidade/Estado: São Paulo
Curtiu: 310 vezes
Mens.Curtidas: 119 vezes

UTF-8

Mensagempor Itamar M. Lins Jr. » 13 Jan 2021 19:39

Olá!
Isso! Estava tentando lembrar:

hb_StrToUtf8( sData, sCodepageIN )
Translates sData from a codepage sCodepageIN to utf8


E o contrario.
hb_Utf8ToStr( sData, sCodepageOUT )   
Translates sData from utf8 to a sCodepageOUT codepage


Essa parte de testes está no LINUX. Estava procurando.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

UTF-8

Mensagempor Mario Mesquita » 13 Jan 2021 19:43

Boa noite.

Kapiaba, dá um erro de execução: "Argument Error". Já tinha tentado algo assim de um exemplo e deu também.

Aparentemente, ele pega o texto do campo da tabela mas não converte, pois dei um display antes e depois e não muda nada.

Uma coisa tão simples dando canseira... vou tentar mais coisas aqui, se alguém puder dar uma luz, desde já agradeço.

Abraço,
Mario.
Avatar de usuário

Mario Mesquita
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 557
Data de registro: 08 Dez 2009 12:47
Cidade/Estado: Rio de Janeiro
Curtiu: 73 vezes
Mens.Curtidas: 13 vezes

UTF-8

Mensagempor Itamar M. Lins Jr. » 13 Jan 2021 20:23

Olá!
Kapiaba, dá um erro de execução: "Argument Error". Já tinha tentado algo assim de um exemplo e deu também.

Qual é a versão do seu Harbour ?

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

UTF-8

Mensagempor Mario Mesquita » 13 Jan 2021 20:42

Oi, Itamar.

Estou usando a 3.4.4 que vem no HMG. Tentado aqui, constatei que ele não reconhece o "PT". Passou com "PTISO" e "PT850", mas não converte o texto que vem do campo da tabela. Fica do mesmo jeito que visto pelo DBU quando abro a tabela.

Quando inicio o programa, está configurado assim:

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


Na minha rotina de leitura está assim:

STATIC FUNCTION Carregar_Nomes()
LOCAL wData1 := Frm_RemessaCCN.DatePicker_1.Value

DBSELECTAR("CLIENTES")

IF ! DBSEEK(DTOS(wData1))
   WHILE ! EOF()
     IF DATACAD >= wData1
        EXIT
     ENDIF
     DBSKIP()
   END
ENDIF

WHILE ! EOF()

  IF DATACAD == wData1
     hb_cdpSelect( "PTISO" )
     HB_LangSelect( "PT" )
     msginfo('entrou: '+CLIENTES->NOME)
     cNome := HB_StrToUTF8(CLIENTES->NOME, "PT")
     msginfo('virou: '+cnome)
     Frm_RemessaCCN.Grid_2.AddItem( { CLIENTES->MATRIC, ;   // 1
                                                            cNome,                   ;   // 2
                                                            CLIENTES->CPF        } ) // 3
     hb_cdpSelect( "UTF8EX" )
  ENDIF
  DBSKIP()
END

RETURN NIL


Parece tão fácil, pegar o conteúdo do campo, converter e botar num grid. Não funciona. Isso era bem importante pra mim, não só nessa tarefa, mas
para futuramente migrar esses dados, quando eu converter meus programas do HMG 3.0.46 para a 3.4.4 ou 3.5, podendo ser para DBF ainda mas futuramente
visando migrar para SQL. Complicado travar em coisas aparentemente bobas.

Se alguém tiver alguma alternativa, agradeço a ajuda.

Abraço,
Mario
Avatar de usuário

Mario Mesquita
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 557
Data de registro: 08 Dez 2009 12:47
Cidade/Estado: Rio de Janeiro
Curtiu: 73 vezes
Mens.Curtidas: 13 vezes

UTF-8

Mensagempor Jairo Maia » 13 Jan 2021 21:00

Tente mudar esse trecho da sua função que está assim:
IF DATACAD == wData1
     hb_cdpSelect( "PTISO" )
     HB_LangSelect( "PT" )
     msginfo('entrou: '+CLIENTES->NOME)
     cNome := HB_StrToUTF8(CLIENTES->NOME, "PT")
     msginfo('virou: '+cnome)
     Frm_RemessaCCN.Grid_2.AddItem( { CLIENTES->MATRIC, ;   // 1
                                                            cNome,                   ;   // 2
                                                            CLIENTES->CPF        } ) // 3
     hb_cdpSelect( "UTF8EX" )
  ENDIF

Para esta forma:
IF DATACAD == wData1
     //hb_cdpSelect( "PTISO" )
     //HB_LangSelect( "PT" )
     msginfo('entrou: '+CLIENTES->NOME)
     cNome := HB_StrToUTF8(CLIENTES->NOME, "PT850")  // <<<==== Mude para PT850 a CodePage aqui
     msginfo('virou: '+cnome)
     Frm_RemessaCCN.Grid_2.AddItem( { CLIENTES->MATRIC, ;   // 1
                                                            cNome,                   ;   // 2
                                                            CLIENTES->CPF        } ) // 3
     //hb_cdpSelect( "UTF8EX" )
  ENDIF
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

UTF-8

Mensagempor Mario Mesquita » 13 Jan 2021 21:22

Oi, Jairo!

Cara, teve uma mudança: Agora ele converteu para exatamente como aparece no DBU. Antes convertia para um outro caractere. Um pequeno progresso.

Agora precisa converter isso pra algo e ficar certo.

Tentei colar a imagem mas não consegui. Nunca fiz. Perdoem a burrice.

Ainda aceitando qualquer dica, amigos.

Abraço,
Mario.
Avatar de usuário

Mario Mesquita
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 557
Data de registro: 08 Dez 2009 12:47
Cidade/Estado: Rio de Janeiro
Curtiu: 73 vezes
Mens.Curtidas: 13 vezes

UTF-8

Mensagempor Mario Mesquita » 13 Jan 2021 21:30

Amigos, consegui.

Dei um chute e entrou no gol, na cagada:

WHILE ! EOF()
  // Cliente sem CPF não será enviado, pois será rejeitado //
  //IF EMPT(ALLTRIM(CLIENTES->CPF))
  //   DBSKIP()
  //   LOOP
  //ENDIF
  ////
  IF DATACAD == wData1
     //hb_cdpSelect( "PTISO" )
     //HB_LangSelect( "PT" )
     msginfo('entrou: '+CLIENTES->NOME)
     cNome := HB_StrToUTF8(HB_AnsiToOem(CLIENTES->NOME), "PT850")
     msginfo('virou: '+cnome)
     Frm_RemessaCCN.Grid_2.AddItem( { CLIENTES->MATRIC, ;   // 1
                                                             cNome,                  ;   // 2
                                                             CLIENTES->CPF      } )  // 3
     //hb_cdpSelect( "UTF8EX" )
  ENDIF
  DBSKIP()
END


Botei o "HB_AnsiToOem()" convertendo o campo, aí o "HB_StrToUTF8()" fez certinho.

Obrigado pelo apoio de vocês. Já estava pifando aqui, sem opções.

Abraço a todos,
Mario.
Avatar de usuário

Mario Mesquita
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 557
Data de registro: 08 Dez 2009 12:47
Cidade/Estado: Rio de Janeiro
Curtiu: 73 vezes
Mens.Curtidas: 13 vezes

UTF-8

Mensagempor JoséQuintas » 13 Jan 2021 22:19

Itamar M. Lins Jr. escreveu:Vai ficar para traz, pq todo mundo está usando UTF8 até a Microsoft, ninguém usa mais ansi, é tudo UTF8. Essas coisas antigas, só para compatibilidade.


Mas... e como fica no programa, até agora não entendi, no que se refere a apenas usar, ou ter que ficar convertendo toda hora.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

UTF-8

Mensagempor Itamar M. Lins Jr. » 13 Jan 2021 22:52

Olá!
Mas... e como fica no programa, até agora não entendi, no que se refere a apenas usar, ou ter que ficar convertendo toda hora.

Ué, só converte 1 vez. Se tiver gravado no BD sem ser UTF8. Se o BD for UTF8 nem precisa.
Converte o DBF ou a BASE em MySQL por exemplo COLATE_XXX para UTF8EX o EX é UTF8 com acentos no Harbour
 hb_cdpSelect( "UTF8EX" )
  HB_LangSelect( "PT" )

Neste caso acima ele usava CP PT850
Então no DBF ele dá um replace

replace all CLIENTES->NOME with HB_StrToUTF8(HB_AnsiToOem(CLIENTES->NOME), "PT850")

Nisso ele já não precisa mais converter nada para UTF8.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

UTF-8

Mensagempor Jairo Maia » 13 Jan 2021 23:47

Apenas para esclarecer algo que parece está confuso nesse tópico desde a primeira mensagem do Mario Mesquita:

REQUEST HB_CODEPAGE_UTF8EX
Este comando instrui o compilador a carregar as funções da CodePage UTF8EX com suporte a caracteres latinos.

hb_cdpSelect("UTF8EX")
Esta função instrui o sistema a usar a CodePage UTF8EX a partir desse ponto em diante no sistema. Até aqui tudo bem, entendido, e nenhuma confusão.

Porém, com esses comandos tem confusão, vamos então entender o que fazem:
REQUEST HB_LANG_PT
Este comando instrui o compilador a carregar as funções de suporte de MENSAGENS INTERNAS DO HARBOUR para o idioma em português.

HB_LangSelect("PT")
Esta função define que o sistema ao exibir mensagens internas do Harbour, como as mensagens de erro por exemplo, que sejam apresentadas no idioma português.

Se omitir esses comandos, as mensagens internas como de erros serão em inglês, que é o padrão do Harbour, assim como era no Clipper.

RESUMINDO:
hb_cdpSelect() = Seleciona a CodePage no sistema
HB_LangSelect() = Seleciona o idioma a ser usado para apresentar as mensagens internas do Harbour.

Não há nenhuma relação entre elas, são definições completamente diferentes.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google [Bot] e 11 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro