RestScreen() falhando com UTF8

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

RestScreen() falhando com UTF8

Mensagem por JoséQuintas »

No notepad++ acho que tem que selecionar a codepage correta (codepage, collation, sei lá como chamam)

Aqui uso Programmers Notepad: ou é ANSI ou é UTF-8, não tem nada sobre codepage.
Por ANSI, acredito que seja o default do Windows, do país aonde o Windows está sendo usado.
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
developer
Usuário Nível 3
Usuário Nível 3
Mensagens: 149
Registrado em: 09 Nov 2024 23:45
Localização: Londrina/PR

RestScreen() falhando com UTF8

Mensagem por developer »

Pois é, desta forma não funciona no NotePad++, acentua corretamente mas os caracteres para desenho das telas não funcionam.
Bem, não uso NotePad++ mas e se você mudar tudo para CP437? Por que não tentar?
E é claro, remova tudo que tem haver com codepage no seu código (remove PTISO), deixa sem nada que já vai ser o CP437, já que é o padrão do Clipper e consequentemente do Harbour.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

RestScreen() falhando com UTF8

Mensagem por JoséQuintas »

codepage.png
Programmers Notepad.
Ou é ANSI ou UTF-8.

Como ANSI tem codepage, suponho que use a mesma do Windows em uso, no meu caso PT-BR.
pnote2.png
PNotepad ou bloco de notas.
As letras acentuadas estão idênticas.

No aplicativo PTISO, tudo idêntico.

MySQL idem.

Sei lá...
Tudo compatível.
Outra codepage pra que ?

Windows 10.
A Microsoft anda alterando EDIT e NOTEPAD pra outros formatos.
Aproveita enquanto tem referência pra acertar isso.

Quer conferir a codepage do programa ?

Código: Selecionar todos

FOR nCont = 1 TO 255
   ?? Chr( nCont )
NEXT
O que aparecer na tela é o que vai poder usar no fonte.

Essa WVT tá bagunçando as coisas ?
Troque pra WVG

Sei lá porque tem fonte que usa isto

Código: Selecionar todos

WVT_SetCodepage( 255 )
Será harbour ? será compilador C ? Será WVT ? Será o raio que o parta ?

Sei lá...
Baixe o Programmers Notepad, use como ANSI.
Edite o fonte.
Compile com WVG.
Saiu certo ?

Agora troque pra WVT.
Saiu certo ? se não saiu troque pra WVG.

Se saiu certo, agora vá no notepad++
Veja se alguma codepage serve
Saiu certo ? se não saiu troque pra PNotepad.

Se com nenhuma funciona, decida o que vai fazer.
Ou usa CHR() e não o caractere direto, ou sei lá o que.

Use o harbour, filtre os caracteres do fonte pra chegar nos que dão problema:

Código: Selecionar todos

REQUEST HB_CODEPAGE_PTISO

#include "hbgtinfo.ch"
#include "set.ch"

PROCEDURE Main
   LOCAL cLetra
SetMode(33,100)
CLS
SET( _SET_CODEPAGE, "PTISO" )
cTexto := MemoRead( "fonte.prg" )
FOR EACH cLetra IN cTexto
   DO CASE
   CASE cLetra $ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
   CASE cLetra $ "abcdefghijklmnopqrstuvwxyz"
   CASE cLetra == Chr(13)
   CASE cLetra == Chr(10)
   CASE cLetra $ "()[]+-,.0123456789"
   OTHERWISE
      ? Asc( cLetra ), cLetra, Substr( cTexto, Max( 1, cLetra:__EnumIndex() - 10 ), 20 )
   ENDCASE
NEXT
Inkey(0)
RETURN
Vai filtrando até só sobrarem os caracteres especiais.
Veja se a letra da tela bate com o que está no fonte.

O pipino é seu, no seu ambiente, com as suas ferramentas.
Use suas ferramentas pra descobrir sobre o pipino.
Se não resolver com as suas ferramentas.... troque de ferramenta.

E compile esse fonte de teste com -w3 -es2 pra garantir que os #defines estão certos.
Com variável errada, dá resultado errado.
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
developer
Usuário Nível 3
Usuário Nível 3
Mensagens: 149
Registrado em: 09 Nov 2024 23:45
Localização: Londrina/PR

RestScreen() falhando com UTF8

Mensagem por developer »

O José tem razão, tem que procurar o que é o problema aí, se preferir posso dar suporte remoto e resolver 100% para você.

...mas e se você mudar tudo para CP437?
Esta minha sugestão acima não vai funcionar para você, pois verifiquei e o Notepad++ não tem CP437, tem apenas:
Capture.PNG
inclusive é bem parecido com o Programmers Notepad neste quesito.


Segue abaixo o código fonte em CP437 (editado pelo Microsoft Visual Studio Code "VSCode"):

Código: Selecionar todos

// CP437

#include 'box.ch'
#include 'inkey.ch'
#include 'hbgtinfo.ch'

Request HB_GT_WVT_DEFAULT


///////////////////////////////////////
PROCEDURE Main()
Public cSistema:= 'SISTEMA TESTE'
Public cEmpresa:= 'EMPRESA ABC'

SETMODE(25,80)

HB_GTINFO(HB_GTI_ISFULLSCREEN, .T.)
HB_GTINFO(HB_GTI_FONTNAME, 'Lucida Console')
hb_gtInfo( HB_GTI_COMPATBUFFER, .F. )

Set Century On
Set Date BRITISH
Set ScoreBoard Off
Set Wrap On

Tela(cEmpresa,cSistema)
SetCursor(0)

SetColor( 'W/N*')

 @ 04, 04, MaxRow()-3, MaxCol()-5 BOX B_DOUBLE + Space( 1 ) 

 @ 06, 04, 06, MAXCOL()-5 BOX B_SINGLE 
 @ 06,04 SAY CHR(199)
 @ 06,MAXCOL()-5 SAY CHR(182)

 @ 04,39,MAXROW()-3,39 BOX CHR(179) 
 @ 04,39 SAY CHR(209) 
 @ MAXROW()-3,39 SAY CHR(207) 
 @ 06,39 SAY CHR(197)

Do While .T.  
   If InKey() == 27
      If Confirma('Abandonar o sistema ?')==1
         Return
     EndIf
   EndIf  
EndDo

RETURN

///////////////////////////////////////
Function Tela()
SetColor('N/N*')
@ 02,00 CLEAR TO 23,79
SetColor('W+/N')
@ 00,01  Say SubStr(cEmpresa,1,27)
@ 00,27 Say '|'
@ 00,28 Say PadC(cSistema,30)
@ 00,57 Say '|'
@ 00,59 Say Date()
@ 00,70 Say '|'
@ 01,00 Say Replicate( ' ', 80 ) Color 'N/W*'
@ 24,00 Say Replicate( ' ', 80 ) Color 'N/W*'
Return(Nil)

///////////////////////////////////////
Function Confirma(cTexto)
Local cOldTela:= SaveScreen(24,00,24,79)
cColor:= SetColor('N/W*,W+/N')
nCol:= (80-Len(cTexto))/2-6
@24,00 Clear To 24,79
@24,nCol Say cTexto
@24,nCol+Len(cTexto)+2 Prompt 'Sim'
@24,nCol+Len(cTexto)+7 Prompt 'Não'
Menu To Confirm
SetColor(cColor)
RestScreen(24,00,24,79,cOldTela)
Return(Confirm)
Compilado assim:

Código: Selecionar todos

hbmk2 teste
O código integral segue abaixo. Tente compilar conforme instruido, sem abrir o fonte, não altere nada, veja o que acontece.
teste.prg
(1.64 KiB) Baixado 50 vezes
Segue ainda o EXE - tem que renomear de teste.txt -> teste.exe pois o forum bloqueia .EXE (compactado com UPX - possivelmente o seu PC vai identificar como vírus, dizendo que é um cavalo de troia, que vai fazer isso, aquilo, etc... Acontece frequentemente com .EXE compactado com UPX, mas fique tranquilo que não é virus)
teste.txt
(512 KiB) Baixado 48 vezes
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

RestScreen() falhando com UTF8

Mensagem por JoséQuintas »

Ué...
Não tem EUA e America Latina ?
Não era assim antes.
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/
Responder