Página 3 de 3

RestScreen() falhando com UTF8

Enviado: 26 Fev 2025 22:43
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.

RestScreen() falhando com UTF8

Enviado: 27 Fev 2025 00:19
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.

RestScreen() falhando com UTF8

Enviado: 27 Fev 2025 14:30
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.

RestScreen() falhando com UTF8

Enviado: 27 Fev 2025 15:52
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 51 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 49 vezes

RestScreen() falhando com UTF8

Enviado: 27 Fev 2025 17:22
por JoséQuintas
Ué...
Não tem EUA e America Latina ?
Não era assim antes.