Página 1 de 2

UTF-8

Enviado: 12 Jan 2021 01:38
por JoséQuintas
hmgextended.png
Sei lá... tanta coisa sobre UTF-8, e aí acontece isso.
E aí?

UTF-8

Enviado: 12 Jan 2021 01:52
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

UTF-8

Enviado: 13 Jan 2021 17:38
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.

UTF-8

Enviado: 13 Jan 2021 19:04
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.

UTF-8

Enviado: 13 Jan 2021 19:08
por Kapiaba
Tente:

Código: Selecionar todos

   cStr := HB_StrToUTF8( TXTdesc, "PT" )
Abs.

UTF-8

Enviado: 13 Jan 2021 19:39
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.

UTF-8

Enviado: 13 Jan 2021 19:43
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.

UTF-8

Enviado: 13 Jan 2021 20:23
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.

UTF-8

Enviado: 13 Jan 2021 20:42
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

UTF-8

Enviado: 13 Jan 2021 21:00
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

UTF-8

Enviado: 13 Jan 2021 21:22
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.

UTF-8

Enviado: 13 Jan 2021 21:30
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.

UTF-8

Enviado: 13 Jan 2021 22:19
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.

UTF-8

Enviado: 13 Jan 2021 22:52
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.

UTF-8

Enviado: 13 Jan 2021 23:47
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.