UTF-8

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

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

UTF-8

Mensagem por JoséQuintas »

hmgextended.png
Sei lá... tanta coisa sobre UTF-8, e aí acontece isso.
E aí?
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

UTF-8

Mensagem por JoséQuintas »

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 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/
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

UTF-8

Mensagem por Mario Mesquita »

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 do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

UTF-8

Mensagem por Itamar M. Lins Jr. »

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.
Saudações,
Itamar M. Lins Jr.
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

UTF-8

Mensagem por Kapiaba »

Tente:

Código: Selecionar todos

   cStr := HB_StrToUTF8( TXTdesc, "PT" )
Abs.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

UTF-8

Mensagem por Itamar M. Lins Jr. »

Olá!
Isso! Estava tentando lembrar:

Código: Selecionar todos

hb_StrToUtf8( sData, sCodepageIN )
Translates sData from a codepage sCodepageIN to utf8
E o contrario.

Código: Selecionar todos

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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

UTF-8

Mensagem por Mario Mesquita »

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 do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

UTF-8

Mensagem por Itamar M. Lins Jr. »

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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

UTF-8

Mensagem por Mario Mesquita »

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:

Código: Selecionar todos

REQUEST HB_CODEPAGE_UTF8EX, HB_CODEPAGE_PT850, HB_CODEPAGE_PTISO, HB_LANG_PT
hb_cdpSelect( "UTF8EX" )
Na minha rotina de leitura está assim:

Código: Selecionar todos

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 do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

UTF-8

Mensagem por Jairo Maia »

Tente mudar esse trecho da sua função que está assim:

Código: Selecionar todos

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:

Código: Selecionar todos

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 do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

UTF-8

Mensagem por Mario Mesquita »

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 do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

UTF-8

Mensagem por Mario Mesquita »

Amigos, consegui.

Dei um chute e entrou no gol, na cagada:

Código: Selecionar todos

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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

UTF-8

Mensagem por JoséQuintas »

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 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/
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

UTF-8

Mensagem por Itamar M. Lins Jr. »

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

Código: Selecionar todos

 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

UTF-8

Mensagem por Jairo Maia »

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

Código: Selecionar todos

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

Código: Selecionar todos

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:

Código: Selecionar todos

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.

Código: Selecionar todos

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)
Responder