PureBasic

Forums PureBasic
Nous sommes le Mar 20/Oct/2020 3:33

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 72 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5  Suivante
Auteur Message
 Sujet du message: Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
MessagePosté: Jeu 15/Sep/2016 12:25 
Hors ligne
Avatar de l’utilisateur

Inscription: Lun 17/Déc/2007 12:44
Messages: 1668
Bonjour,

Pour moi le problème est simple, PureBasic ne prend pas en compte le "Charset" de la police. En gros on a "#ANSI_CHARSET" qui permet de mettre l'Ansi de la police que l'on utile (et si cela existe pour cette police de caractère).

J'ai exposé ce problème en 2012 (viewtopic.php?p=149681#p149681). Voir aussi (https://msdn.microsoft.com/en-us/library/cc194829.aspx) pour les constantes possible.

Cordialement,
GallyHC

_________________
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
MessagePosté: Jeu 15/Sep/2016 12:35 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3673
Localisation: Encore ?
N'aie crainte PAPIPP, je ne parlais pas d'un nettoyage au sens propre. Il me faut admirer ta clémence qui, dans ta liste exhaustive, t'a fait ommettre l'égyptien antique et le maya.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
MessagePosté: Jeu 15/Sep/2016 15:48 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2149
bon la solution est trouvé finalement :) (Merci a Marc56 pour ses tests ;) )

Mesa avait raison !! , pour XP, il faut simplement charger la fonte qui va bien :)
cette fonte n'etant pas celle par defaut sous XP ... les caractères graphique manquent a l'appel sous cet OS
il a juste eu tord de dire que j'avais massacré son code .... alors qu'il ne manquait en fait que 2 lignes de code pour qu'il marche sous XP ....
et il n'a pas tenu compte du fait que sous Seven, le code fonctionne meme sans loader une fonte ..... (mais il ne pouvait le savoir
ne disposant pas de seven apparemment )

le chargement de la fonte fonctionne aussi sous Windows 7 et 10 , ça vaut donc pour tout les Windows !

ce code , fait le boulot , d'afficher tout les caracteres 1 a 255 , caracteres Graphique compris
pour tout les systemes Windows

en fait je reprends le meme code que je propose, depuis le debut , j'ai juste ajouté en debut de code :
Code:
LoadFont(#font,"Lucida",10)
SetGadgetFont(#PB_Default, FontID(#font))



ce qui donne ceci :

Code:
; modifié Zorro

Enumeration
      #Win
      #list
EndEnumeration

Declare.s Ascii_sous_unicode(MonMessageANSI.s)

Enumeration
      #Font
EndEnumeration

LoadFont(#font,"Lucida",10)
SetGadgetFont(#PB_Default, FontID(#font))


debug Ascii_sous_unicode(chr(203)  ) ; respecte les accents

OpenWindow(#Win , 0, 0, 880, 500, "ascii...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListIconGadget(#list, 0, 0, 880, 500, "0..31", 110,#PB_ListIcon_GridLines)
AddGadgetColumn(#list, 1, "32..63", 110)
AddGadgetColumn(#list, 2, "64..95", 110)
AddGadgetColumn(#list, 3, "96..127", 110)
AddGadgetColumn(#list, 4, "128..159", 110)
AddGadgetColumn(#list, 5, "160..191", 110)
AddGadgetColumn(#list, 6, "192..223", 110)
AddGadgetColumn(#list, 7, "224..255", 110)
ii.s=chr(10)
For i=0 To 31
      i$=Ascii_sous_unicode(chr(i))
      i2$=Ascii_sous_unicode(chr(i+32))
      i3$=Ascii_sous_unicode(chr(i+64))
      i4$=Ascii_sous_unicode(chr(i+96))
      i5$=Ascii_sous_unicode(chr(i+128))
      i6$=Ascii_sous_unicode(chr(i+160))
      i7$=Ascii_sous_unicode(chr(i+192))
      i8$=Ascii_sous_unicode(chr(i+224))
      AddGadgetItem(#list, -1,Str(i)+" "+i$+ii.s+Str(i+32)+" "+i2$+ii.s+ Str(i+64)+" "+i3$+ii.s+ Str(i+96)+" "+i4$+ii.s+ Str(i+128)+" "+i5$+ii.s+ Str(i+160)+" "+i6$+ii.s+ Str(i+192)+" "+i7$+ii.s+Str(i+224)+" "+i8$+#LF$)   
Next i
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

Procedure.s Ascii_sous_unicode(MonMessageANSI.s)
      MonMessageASCII.s = space(Len(MonMessageANSI.s))
      ;CharToOem_(@MonMessageANSI.s, @MonMessageASCII.s)
      OemToChar_(@MonMessageANSI.s, @MonMessageASCII.s)
      ProcedureReturn MonMessageASCII.s
EndProcedure



; Epb



donc la procedure :

Code:
Procedure.s Ascii_sous_unicode(MonMessageANSI.s)
      MonMessageASCII.s = space(Len(MonMessageANSI.s))
      ;CharToOem_(@MonMessageANSI.s, @MonMessageASCII.s)
      OemToChar_(@MonMessageANSI.s, @MonMessageASCII.s)
      ProcedureReturn MonMessageASCII.s
EndProcedure


remplace avantageusement celle D'Olivier (en taille du moins ) ! ;)

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
MessagePosté: Jeu 15/Sep/2016 18:09 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3673
Localisation: Encore ?
C'est sûr, pour ceux qui souhaitent se gameller avec les essais de Zorro, qu'ils y aillent : c'est ci-dessus.

En attendant, voici le code complet de PeekANSI() ci-dessous.
Je ne l'ai pas vérifié (c'est du copier-coller de mes petits codes précédents).

Code:
;{ FindMemory Lib }
Macro _FindUnit_(UnitFunction, UnitSymbol, UnitSize, UnitSize_, StopConditionSymbol,
NonStopConditionSymbol, RegisterPrefix)
Procedure FindMemory#UnitFunction(*ResearchStart, WantedValue, MaximumQuantityToBeScanned
= -1)
! mov RegisterPrefix#ax, [p.v_WantedValue]
! mov RegisterPrefix#cx,
[p.v_MaximumQuantityToBeScanned]
! mov RegisterPrefix#di, [p.p_ResearchStart]
! xor RegisterPrefix#bx, RegisterPrefix#bx
! shr RegisterPrefix#cx, UnitSize_
! rep#StopConditionSymbol scas#UnitSymbol
! lea RegisterPrefix#di, [RegisterPrefix#di -
UnitSize]
! lea RegisterPrefix#ax, [RegisterPrefix#bx]
! cmov#NonStopConditionSymbol RegisterPrefix#ax, RegisterPrefix#di
ProcedureReturn
EndProcedure
EndMacro
Macro _FindMemory_(UnitName, UnitSymbol, UnitSize, UnitSize_)
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
CompilerIf UnitSize < 8
_FindUnit_(UnitName, UnitSymbol, UnitSize, UnitSize_, ne, e, e)
_FindUnit_(Non#UnitName, UnitSymbol, UnitSize, UnitSize_, e, ne, e)
CompilerEndIf
CompilerElseIf #PB_Compiler_Processor = #PB_Processor_x64
_FindUnit_(UnitName, UnitSymbol, UnitSize, UnitSize_, ne, e, r)
_FindUnit_(Non#UnitName, UnitSymbol, UnitSize, UnitSize_, e, ne, r)
CompilerEndIf
EndMacro
_FindMemory_(Byte, b, 1, 0)
;}


Global CNV.S
CNV = "00c700fc00e900e200e400e000e500e700ea00eb00e800ef00ee00ec00c400c5"
CNV + "00c900e600c600f400f600f200fb00f900ff00d600dc00a200a300a520a70192"
CNV + "00e100ed00f300fa00f100d100aa00ba00bf231000ac00bd00bc00a100ab00bb"
CNV + "259125922593250225242561256225562555256325512557255d255c255b2510"
CNV + "25142534252c251c2500253c255e255f255a25542569256625602550256c2567"
CNV + "2568256425652559255825522553256b256a2518250c25882584258c25902580"
CNV + "03b100df039303c003a303c300b503c403a6039803a903b4221e03c603b52229"
CNV + "226100b1226522642320232100f7224800b0221900b7221a207f00b225a000a0"
Procedure.S PeekANSI(*A, Length = 0)
Define.S String
Define I, Code
If Length
*X = AllocateMemory(Length * 2 + 2)
For I = 1 To Length
Code = PeekA(*A + (I - 1) )
If Code > 128
Part.S = Mid(CNV, ((Code - 128) * 4) + 1, 4)
Code = Val("$" + Part)
EndIf
PokeU(*X + (2 * (I - 1) ), Code)
Next
String = PeekS(*X, Length)
Else
String = PeekANSI(*A, FindMemoryByte(*A, 0) - *A)
EndIf
ProcedureReturn String
EndProcedure

; ==================
; Exemple de base
; ==================

DataSection
Ici:
Data.A 133, 0 ; Caractère 'à'
EndDataSection

debug PeekANSI(?Ici)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
MessagePosté: Ven 16/Sep/2016 7:30 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2149
Ollivier a écrit:
C'est sûr, pour ceux qui souhaitent se gameller avec les essais de Zorro, qu'ils y aillent : c'est ci-dessus.


:lol: lire la suite ...... :mrgreen:

Citation:
En attendant, voici le code complet de PeekANSI() ci-dessous.
Je ne l'ai pas vérifié (c'est du copier-coller de mes petits codes précédents).


le probleme est bien là !! ,car ton code plante ligne 31 :mrgreen: :mrgreen: :mrgreen:
alors .... qui se gamelle ???

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
MessagePosté: Ven 16/Sep/2016 18:42 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3673
Localisation: Encore ?
@Zorro

J'ai averti qu'il était non vérifié. N'est-ce pas, de ma part, une note de sincérité? (voire de modestie!)

Qui se gamelle? Ben nous deux, par contre, moi j'avertis tant que possible.

Un exemple simple avec ton code (j'avertis encore : je n'ai pas vérifié si ce que j'affirme sur ton code est vrai).

Code:
DataSection
Ici:
Data.A 233, 116, 233, 0
EndDataSection


Ça, c'est une chaîne à zéro terminal de trois caractères qui signifie "été".
Question : Peux-tu me faire le code source adéquat à "ta" manière?

De mon côté, je constate que le caractère bizarre qui vous a gêné en début de sujet ainsi que les bogues du dernier code sont dûs à la méthode de copier/coller. Le programme en lui-même est fiable si tu vires les retours chariot.

Je ne résoudrai ce problème que dans deux mois (ça va te faire des vacances pendant ce temps-là!).


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
MessagePosté: Sam 17/Sep/2016 8:54 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2149
Ollivier a écrit:
Un exemple simple avec ton code (j'avertis encore : je n'ai pas vérifié si ce que j'affirme sur ton code est vrai).

Question : Peux-tu me faire le code source adéquat à "ta" manière?



ben avec Seven et Pb5.50 (donc en unicode)
il me suffit de faire ceci :

Code:

;**************** start code in code : ascii.pb *************

Enumeration
      #Font
EndEnumeration

LoadFont(#font,"Lucida",10)
SetGadgetFont(#PB_Default, FontID(#font))

c=255
openconsole()
Restore start:
while c<>0
      read.a  c
      print (chr(c))   
      sorti$=sorti$+chr(c)
wend
debug sorti$
input()
CloseConsole()

;************************* end code in code *************

DataSection
      start:
      Data.A 233, 116, 233, 0
EndDataSection ;<



résultat (en console et par debug) : Image

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
MessagePosté: Sam 17/Sep/2016 9:50 
Hors ligne

Inscription: Mer 14/Sep/2011 16:59
Messages: 934
J'ai été très étonné de voir sur wikipédia qu'il y avait autant de variante de l'ascii qu'il y avait de machine et de système 8O 8O 8O

IBM a son ascii, linux a son ascii et même le sinclair zx spectrum ou le comodore ou atari ont leur propre ascii !

Microsoft a créé 21 variantes de l'ascii sous forme de page de code (page850 pour l'europe occidentale, page437 pour les usa)

De plus Microsoft utilise l'ascii-page-de-code pour DOS et les fenêtres consoles mais les fenêtres standards (non consoles) utilisent d'autre jeux de caractères comme l'ansi...

En résumé, pour Windows en europe occidentale, vous aurez 3 ascii différents:
-> US-ASCII
-> PAGE850 sous DOS et console
-> Ascii-ANSI pour le système et ses fenêtres

Plus UNICODE qui contient ces 3 asciis.

Cependant, si on cherche à afficher les caractères et les lettres accentuées les plus utilisées comme le "é" alors presque toutes les polices unicodes fonctionneront avec un simple "chr".

Voici ma solution qui gère le "vrai" US-ASCII et la page850 de Microsoft
(Pour info, IBM a sa propre variante ici http://www-01.ibm.com/software/globaliz ... 00850.html)
(J'ai un petit bug sur le caractère 0 que je n'arrive pas à identifier)

Code:
; Original code from Ollivier http://www.purebasic.fr/french/posting.php?mode=reply&f=6&t=16283
; Modified by Mesa.

;https://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange
;http://www.asciitable.com/ extended ascii
;https://fr.wikipedia.org/wiki/Page_de_code_850
;https://fr.wikipedia.org/wiki/Page_de_code_437
;IBM variant of the page850:http://www-01.ibm.com/software/globalization/cp/cp00850.html

;EnableExplicit
DataSection
  ;US-ASCII Extended
  Ascii_EXT:   
  Data.u $00c7, $00fc, $00e9, $00e2, $00e4, $00e0, $00e5, $00e7, $00ea, $00eb, $00e8, $00ef, $00ee, $00ec, $00c4, $00c5
  Data.u $00c9, $00e6, $00c6, $00f4, $00f6, $00f2, $00fb, $00f9, $00ff, $00d6, $00dc, $00a2, $00a3, $00a5, $20a7, $0192
  Data.u $00e1, $00ed, $00f3, $00fa, $00f1, $00d1, $00aa, $00ba, $00bf, $2310, $00ac, $00bd, $00bc, $00a1, $00ab, $00bb
  Data.u $2591, $2592, $2593, $2502, $2524, $2561, $2562, $2556, $2555, $2563, $2551, $2557, $255d, $255c, $255b, $2510
  Data.u $2514, $2534, $252c, $251c, $2500, $253c, $255e, $255f, $255a, $2554, $2569, $2566, $2560, $2550, $256c, $2567
  Data.u $2568, $2564, $2565, $2559, $2558, $2552, $2553, $256b, $256a, $2518, $250c, $2588, $2584, $258c, $2590, $2580
  Data.u $03b1, $00df, $0393, $03c0, $03a3, $03c3, $00b5, $03c4, $03a6, $0398, $03a9, $03b4, $221e, $03c6, $03b5, $2229
  Data.u $2261, $00b1, $2265, $2264, $2320, $2321, $00f7, $2248, $00b0, $2219, $00b7, $221a, $207f, $00b2, $25a0, $00a0
 
  ;MICROSOFT ASCII WESTERN EUROPE Extended
  Page850:
  Data.u $00c7, $00fc, $00e9, $00e2, $00e4, $00e0, $00e5, $00e7, $00ea, $00eb, $00e8, $00ef, $00ee, $00ec, $00c4, $00c5
  Data.u $00c9, $00e6, $00c6, $00f4, $00f6, $00f2, $00fb, $00f9, $00ff, $00d6, $00dc, $00f8, $00a3, $00d8, $00d7, $0192
  Data.u $00e1, $00ed, $00f3, $00fa, $00f1, $00d1, $00aa, $00ba, $00bf, $00ae, $00ac, $00bd, $00bc, $00a1, $00ab, $00bb
  Data.u $2591, $2592, $2593, $2502, $2524, $00c1, $00c2, $00c0, $00a9, $2563, $2551, $2557, $255d, $00a2, $00a5, $2510
  Data.u $2514, $2534, $252c, $251c, $2500, $253c, $00e3, $00c3, $255a, $2554, $2569, $2566, $2560, $2550, $256c, $00a4
  Data.u $00f0, $00d0, $00ca, $00cb, $00c8, $0131, $00cd, $00ce, $00cf, $2518, $250c, $2588, $2584, $00a6, $00cc, $2580
  Data.u $00d3, $00df, $00d4, $00d2, $00f5, $00d5, $00b5, $00fe, $00de, $00da, $00db, $00d9, $00fd, $00dd, $00af, $00b4
  Data.u $00ad, $00b1, $2017, $00be, $00b6, $00a7, $00f7, $00b8, $00b0, $00a8, $00b7, $00b9, $00b3, $00b2, $25a0, $00a0
  ;Graphic mode n°00..31
  Data.u $0020, $263a, $263b, $2665, $2666, $2663, $2660, $2022, $25d8, $25cb, $25d9, $2642, $2640, $266a, $266b, $263c
  Data.u $25ba, $25c4, $2195, $203c, $00b6, $00a7, $25ac, $21a8, $2191, $2193, $2192, $2190, $221f, $2194, $25b2, $25bc
  ;Caracter n°127
  Data.u $2302
 
  ;;MICROSOFT ASCII USA Extended (IBM)
  ;Page437:
  ; TODO
 
  ; TODO: VG5000, Sinclair ZX spectrum, comodore, atari, msx, as400 (EBCDIC), Apple, Unix, Linux, etc...
 
EndDataSection




Procedure.S Ascii2Unicode(*Ascii, Length = 0, Page.u=0, GraphicMode.b=#False)
  ;Page: 0 => ascii, 850 => PageDOS 850, 437 => PageDos 437, etc
  ;GraphicMode = Caracters 0 to 31 and 127 are not control caraters but printable caracters. Only with page 850, 437 ...
 
  Protected.l i
  Protected.i *Unicode
  Protected.u Code
  Protected.s StringUnicode
 
  Dim Ascii_EXT.u(128+32+1)
 
  If Length =0
    MessageRequester("Attention", "Length can't be 0",#PB_MessageRequester_Warning)
    End
  EndIf   
 
  Select Page
    Case 0 ; ========================= US-ASCII
      Restore Ascii_EXT
      For i=0 To 127
        Read.u Ascii_EXT(i)
      Next i
     
      *Unicode = AllocateMemory(Length * 2)
     
      If *Unicode = 0
        MessageRequester("Attention", "Memory problem!", #PB_MessageRequester_Warning)
        End
      EndIf
     
      For I = 0 To Length -1
        Code = PeekA(*Ascii + I)
        If Code > 127
          Code = Ascii_EXT(Code-128)
        EndIf
       
        PokeU(*Unicode + (2 * (I - 1) ), Code)
       
      Next
     
      StringUnicode.s = PeekS(*Unicode, Length)
     
     
     
    Case 850 ; ========================= Microsoft Page 850 Western Europe
      Restore Page850
      For i=0 To 160
        Read.u Ascii_EXT(i)
      Next i
     
      *Unicode = AllocateMemory(Length * 2)
     
      If *Unicode = 0
        MessageRequester("Attention", "Memory problem!", #PB_MessageRequester_Warning)
        End
      EndIf
     
      For I = 0 To Length -1
        Code = PeekA(*Ascii + I)
        If Code > 127
          Code = Ascii_EXT(Code-128)
        EndIf
        If GraphicMode > 0 And code = 127 ; (Beware of Short-circuit evaluations with "if" ?)
          Code = Ascii_EXT(160)
        EndIf
        If GraphicMode > 0 And code < 32   
          Code = Ascii_EXT(Code+128)
        EndIf
       
        PokeU(*Unicode + (2 * (I - 1) ), Code)
       
      Next
     
      StringUnicode.s = PeekS(*Unicode, Length)
     
     
     
      ;Case 437 ; ========================= Page 437 USA
      ; TODO
     
    Default
      MessageRequester("Attention", "Page unknown",#PB_MessageRequester_Warning)
      End
  EndSelect
 
  ProcedureReturn StringUnicode
 
EndProcedure


; For example, fullfills the 256 caracters in a buffer
*x = AllocateMemory(256)
For I = 0 To 255
  PokeA(*x + i,  i)
Next

; Decoding...
; A$ = Ascii2Unicode(*x, 256); US-ASCII
; A$ = Ascii2Unicode(*x, 256, 850); Page 850 TEXTE
A$ = Ascii2Unicode(*x, 256, 850, #True); Page 850 GRAPHIQUE ; <=== Bug on the caractere 0 ! ! !


; The trick is there, use lucida font (Should be present on every platform, and very important for Windows XP!)
LoadFont(0, "lucida", 10)


OpenWindow(0, 0, 0, 880, 550, "Ascii to Unicode in a system's window...", #PB_Window_SystemMenu )
ListIconGadget(0, 0, 0, 880, 550, "0..31", 110, #PB_ListIcon_GridLines)
SetGadgetFont(0, FontID(0))
AddGadgetColumn(0, 1, "32..63", 110)
AddGadgetColumn(0, 2, "64..95", 110)
AddGadgetColumn(0, 3, "96..127", 110)
AddGadgetColumn(0, 4, "128..159", 110)
AddGadgetColumn(0, 5, "160..191", 110)
AddGadgetColumn(0, 6, "192..223", 110)
AddGadgetColumn(0, 7, "224..255", 110)

;Print...
For i=0 To 31
  AddGadgetItem(0, -1, Mid(A$,i,1) + Chr(10) + Mid(A$,i +32,1) + Chr(10)  +
                       Mid(A$,i + 64,1)  + Chr(10)  + Mid(A$,i +96,1) + Chr(10)  +
                       Mid(A$,i + 128,1) + Chr(10)  + Mid(A$,i +160,1) + Chr(10)  +
                       Mid(A$,i + 192,1) + Chr(10)  + Mid(A$,i +224,1))   
Next i


OpenWindow(1, WindowX(0)+WindowWidth(0,#PB_Window_FrameCoordinate), 0, 300, 550, "... it's not a console !",  #PB_Window_SystemMenu)
CanvasGadget(2, 0, 0, 300, 550)
StartDrawing(CanvasOutput(2) )
DrawingFont(FontID(0) )
A=0
For Y = 0 To 15
  For X = 0 To 15
    DrawText(10+X * 16, Y * 32, Mid(A$, A , 1), RGB(0, 0, 0), RGB(255, 255, 255) )
    a=a+1
  Next
Next
StopDrawing()

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow




Mesa.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
MessagePosté: Sam 17/Sep/2016 12:16 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3673
Localisation: Encore ?
@Zorro

Après quatre pages, il serait ptêt temps d'être dans le sujet! Je t'ai mâché le travail. Pour l'instant, mon tout 1er code de ce sujet, il s'en fout sur quel OS il tourne, et je dois te te dire que ce n'est franchement pas gênant s'il force à indiquer la longueur de la chaîne d'origine, à cause d'un trou.

Tu l'as dit toi-même sur ce forum il y a neuf ans: "moi, j'aime bien les procédures, tout est contenu comme dans un sac poubelle, alors Ollivier, mets-moi ça dans une procédure."

Je te redis la même mais sans le sac poubelle!

Allez bon courage!
Code:
;****************************************************************
; Programme en mode Unicode
Procedure PeekByZorro(*Address, Size)
Define.S UnicodeString

; "ta" méthode
CompilerIf #PB_Compiler_OS = #PB_Compiler_Linux
; Linux

CompilerElse
; Windows

CompilerEndIf

ProcedureReturn UnicodeString
EndProcedure

DataSection
Ici: ; <--- C'est ça qu'il faut récupérer avec ?Ici
; (pas jouer avec restore: les programmes externes
; ne connaissent pas ça)
Data.A 233, 116, 233, 205, 0 ; rajouté 205 pour le fun
EndDataSection


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
MessagePosté: Sam 17/Sep/2016 12:39 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 13/Déc/2015 11:05
Messages: 648
Localisation: Allez, cherche...
Pour en retenir l'important :
Les Américains on créé l'ASCII, codant un caractére entre 0 et 127 (sur un octet), donc il restait un bit non utilisé à la fin. Mais l'ASCII ne prenant pas en charge les accentués européens et apparentés (accents, voyelles avec accents, trémas, barres, ect...), des compagnies européennes et des fabricants on eu l'idée d'utiliser le dernier bit d'ASCII pour coder les accentués. Comme chacun faisait alors ce qu'il voulait, il y avait alors tout un tas de standards en fonction du fabricant. Dans cet ASCII étendu, on a les Codepage 437 et 853 d'IBM et aussi le Windows 1252, ce dernier étant utilisé sous les terminaux Windows (et dans cmd.exe).
Il faut donc bien retenir que quel que soit la version d'ASCII étendu utilisée, seuls les caractéres de 0 à 127 restent identiques, les autres (de 128 à 255) varient en fonction de la version.
Pour harmoniser tout le monde l'ISO a défini la norme ISO-8859-1, pour tous les accentués d’Europe de l'ouest (aussi connu sous le nom de Latin-1), en omettant un truc qui n'existait pas encore : l'€. D'autres standards ISO existent : 885-2, 3,4,5,...,9...,15. L'ISO-8859 reprend les 127 caractères ASCII de 0 à 127, et est donc compatible ASCII.
L'ISO-8859-15 est celui utilisé actuellement en Europe de l'ouest, et est identique à l'ISO-8859-1 plus le signe €. Ce systéme permet d'utiliser l'intégralité des accentués des caractéres de l'alphabet latin : les "é,à,è" et autres accent, les trémas, les o barrés suédois, les A avec un rond au dessus, les voyelles accentuées tahitiennes, les accents circonflexes et cédilles, ect...
Les ISO intermédiaires codent les autres alphabets européens (russe, grec, turc...).

L'Unicode a été inventé ensuite pour permettre de représenter tous les caractéres existants au monde (en particulier pour les langues asiatiques). Il premet de coder 1 114 111 caractéres, dont seuls 250 000 sont utilisés actuellement. La meilleure facon d'écrire en Unicode est avec le standard UTF-8, qui permet de coder un caractére unicode sur 1,2,3 ou 4 octets selon son code.

Bref, si on veut éviter de s'em****** inutilement on code en ISO-8859-15 ou en Unicode...

Visiblement le débogueur est en Unicode? ou plutot en ISO-8859-1, puisqu'il ne comprend pas l'ascii étendu Window 1252 (le truc de cmd). Ca m'étonnerait qu'il soit en ASCII brut mais j'ai jamais été regarder s'il affichait les accents... :P

(et merci a mon prof d'info, c'était le sujet du cours d'hier :mrgreen: )

_________________
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
MessagePosté: Sam 17/Sep/2016 13:53 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2149
@olivier

c'est pas parceque tu changes la façon de lire la valeur, que ça va changer la façon de faire ...
c'est toi qui ne comprends pas tout

j'ai juste pas trop capté ta remarque :
Citation:
(pas jouer avec restore: les programmes externes ne connaissent pas ça)

mais bon c'est pas trop grave, ça m'empeche pas de dormir :roll:


voici avec ta datasection , comment je fait sous Seven , PB5.50 et un gadget editeur (ben oui faut vivre avec sont temp )
Code:
;****************************************************************

Enumeration
      #win
      #Font
      #editor
EndEnumeration
LoadFont(#font,"Lucida",10)
SetGadgetFont(#PB_Default, FontID(#font))

OpenWindow(#win,10,10,320,200,"editeur")
EditorGadget(#editor,1,1,320,200)
debug  PeekS(?ici,4,#PB_Ascii  )   
AddGadgetItem(#editor, -1,  PeekS(?ici,4,#PB_Ascii  )   )

Repeat
      Event = WaitWindowEvent()
      Select Event
      Case #PB_Event_Gadget
            Select EventGadget()
            Case #editor
            EndSelect
      EndSelect
Until Event = #PB_Event_CloseWindow



;********
DataSection
      Ici: ; <--- C'est ça qu'il faut récupérer avec ?Ici
      ; (pas jouer avec restore: les programmes externes
      ; ne connaissent pas ça)
      Data.A 233, 116, 233, 205, 0 ; rajouté 205 pour le fun
EndDataSection


et voici le resultat sous Gadget editeur et Debugger
Image


Mesa a donné la Vraie solution , c'est effectivement de charger la bonne fonte
ce qui rends ta procedure "universel" completement inutile :lol: :lol:
tout au plus ça fonctionne sous XP , mais sous Seven et 10 elle ne sert a rien !
ça n'a plus d'interet depuis qu'on code en Pb 5.50 UNICODE par defaut ! et qu'il existe des Flags dédiés pour la fonction PeekS(), openfile() etc...
et aura encore moins d'interet, le jour ou tout le monde sera sous Win 10

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
MessagePosté: Sam 17/Sep/2016 14:41 
Hors ligne

Inscription: Sam 23/Fév/2008 17:58
Messages: 499
Bonjour à tous.

Afin de vérifier les caractères produits sous unicode en 32 ou 64 bits sous n’importe quel système.
Voici un prg qui test 80 caractères par 80 de 0 à 65535 tous les caractères sous debug de PB et sous l’option console (on peut remplacer 80 par 128).

Choisissez dans Pb ( Préférences.. Débogueur.. Configuration..) la police que vous désirez tester.
J’ai trouvé pour mon compte une police Arialuni unicode qui donne de bons résultats mais vous pouvez tester une autre police et surprise vous pouvez trouver des caractères au-delà de l’indice 255.

Avec PB550 pas de Problème quelques différences entre console et débug (si les polices ne sont pas les mêmes).

Avec PB542 unicode pas de Problème on trouve la même chose que sous PB550.

Par contre en Pb542 ANSI normal caractères Ansi seulement production de caractères avec une récurrence tous les 256 indices aussi bien sous débug que sous console
On peut dans le même temps observer la différence si les polices sous console et sous debug sont différentes

Code:
OpenConsole("Essai police normale et unicode sous debug et console  OS 32 ou 64 bits")
For i=0 To 65535
  a$+Chr(i)
  If i%80=0
    Debug "N° i="+ Str(i)+" "+a$
    PrintN("N° i="+ Str(i)+" "+a$ )
    Input()
    If i=0
      PrintN("Après chaque arrêt appuyer sur [Entrée] pour continuer")
    EndIf 
    a$=""
  EndIf 
Next
if a$<>""
     Debug "N° i="+ Str(i)+" "+a$
    PrintN("N° i="+ Str(i)+" "+a$ )
endif
Input()
CloseConsole()



Trouvez-vous les mêmes résultats ??

A+

_________________
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
MessagePosté: Sam 17/Sep/2016 16:26 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3673
Localisation: Encore ?
Zorro a écrit:
c'est toi qui ne comprends pas tout
Comme ça, c'est fait...

Pour te donner une idée concrète, c'est comme si, pour le prendre en photo et le relâcher vivant, je te demandais d'aller pêcher un poisson sans te mouiller les mains.

Toi, tu me sors "T'inquiète, un simple piège, à marée basse, on le coince le poisson!" (technique de l'API).
Je te dis que ça marche pas : il est sec le poisson dans le sable. Tu me sors alors une soufflerie mobile entraînée par un moteur de 2000 chevaux en me disant qu'on va faire un trou d'air dans l'eau jusqu'au poisson. (technique PeekS(#PB_Ascii) )
Résultat : poisson séché.
Tu me dis enfin que je n'y connais rien à la météo qu'il faut que je regarde bien devant moi la tornade qui va aspirer le poisson dans les airs, et qu'il faut que je prépare mon appareil photo.
Résultat : poisson aspiré dans l'atmosphère, séché, congelé, foudroyé, et éclaté au sol après une chute de huit kilomètres (impact au sol à mach 0,5 : technique du Restore+Chr+OpenConsole+Etc...).

L'atmosphère a ses règles. L'Unicode aussi : http://www.unicode.org

En attendant, j'ai modifié ton code:
PeekS en PeekANSI, peut-être que tu comprendras la subtilité...
Code:
;****************************************************************
Enumeration
#win
#Font
#editor
EndEnumeration
LoadFont(#font,"Lucida",10)
SetGadgetFont(#PB_Default, FontID(#font))
OpenWindow(#win,10,10,320,200,"editeur")
EditorGadget(#editor,1,1,320,200)
debug PeekS(?ici,4,#PB_Ascii )
AddGadgetItem(#editor, -1, PeekANSI(?ici,4) )
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #editor
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
;********
DataSection
Ici: ; <--- C'est ça qu'il faut récupérer avec ?Ici
; (pas jouer avec restore: les programmes externes
; ne connaissent pas ça)
Data.A 233, 116, 233, 205, 0 ; rajouté 205 pour le fun
EndDataSection


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
MessagePosté: Sam 17/Sep/2016 18:00 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 13/Déc/2015 11:05
Messages: 648
Localisation: Allez, cherche...
Petite correction a mon précédent post : le débogueur est bien en unicode (en tout cas il affiche tout jusqu'a 65000 et des poussiéres (enfin 2^16 quoi ), et je n'ai pas testé plus loin... La police du débogueur par défaut est donc Unicode. Sous XP je vais tester mais ca m'étonnerait.
Ah aussi, PeekANSI() est mal nommé... il faudrait appeler ca PeekExtendedASCII() ou autres, mais l'ANSI n'est pas un code, c'est l'organisme qui a créé l'ASCII. ANSI = American National Standard Institute.
voila, c'est du chipotage je sais... mais au moins c'est dit :mrgreen:

_________________
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
MessagePosté: Sam 17/Sep/2016 19:47 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2149
Ollivier a écrit:
Zorro a écrit:
En attendant, j'ai modifié ton code:
PeekS en PeekANSI, peut-être que tu comprendras la subtilité...


donc ce qui reviens a ceci , c'est a dire en ajoutant ta procedure qui manque a tout tes codes
et aussi en ajoutant un effets esthetique de mise en forme du code

Code:
;****************************************************************
Declare.s PeekANSI(*a, length = 0)

Enumeration
      #win
      #Font
      #editor
EndEnumeration
LoadFont(#font,"Lucida",10)
SetGadgetFont(#PB_Default, FontID(#font))
OpenWindow(#win,10,10,320,200,"editeur")
EditorGadget(#editor,1,1,320,200)
debug PeekS(?ici,4,#PB_Ascii )
AddGadgetItem(#editor, -1, PeekANSI(?ici,4) )
Repeat
      Event = WaitWindowEvent()
      Select Event
      Case #PB_Event_Gadget
            Select EventGadget()
            Case #editor
            EndSelect
      EndSelect
Until Event = #PB_Event_CloseWindow
;********
DataSection
      Ici: ; <--- C'est ça qu'il faut récupérer avec ?Ici
      ; (pas jouer avec restore: les programmes externes
      ; ne connaissent pas ça)
      Data.A 233, 116, 233, 205, 0 ; rajouté 205 pour le fun
EndDataSection


Global CNV.S
CNV = "00c700fc00e900e200e400e000e500e700ea00eb00e800ef00ee00ec00c400c5"
CNV + "00c900e600c600f400f600f200fb00f900ff00d600dc00a200a300a520a70192"
CNV + "00e100ed00f300fa00f100d100aa00ba00bf231000ac00bd00bc00a100ab00bb"
CNV + "259125922593250225242561256225562555256325512557255d255c255b2510"
CNV + "25142534252c251c2500253c255e255f255a25542569256625602550256c2567"
CNV + "2568256425652559255825522553256b256a2518250c25882584258c25902580"
CNV + "03b100df039303c003a303c300b503c403a6039803a903b4221e03c603b52229"
CNV + "226100b1226522642320232100f7224800b0221900b7221a207f00b225a000a0"

Procedure.S PeekANSI(*A, Length = 0)
      Define.S String
      Define I, Code
      If Length
            *X = AllocateMemory(Length * 2)
            For I = 1 To Length
                  Code = PeekA(*A + (I - 1) )
                  If Code > 128
                        Part.S = Mid(CNV, ((Code - 128) * 4) + 1, 4)
                        Code = Val("$" + Part)
                  EndIf
                  PokeU(*X + (2 * (I - 1) ), Code)
            Next
            String = PeekS(*X, Length)
      Else
            
      EndIf
      ProcedureReturn String
EndProcedure


bon, ben pas de bol , sous Seven voici ce que ça donne
Image

bref , il n'y a rien dans l'editeur !! les caracteres n'apparaissent pas !

suggestion: arrete de coder avec des gants de box sur un Raspberry Pi , et passe a un vrais ordinateur avec un Vrais editeur qui au minimum met le code en forme , et permet d'inclure les procedures qu'il appel ...

alors ... alors peut etre verra tu , et comprendra tu que ton code sous Seven et Win10 ne sert a rien
tout au plus , je subodore qu'il doit servir au Rares utilisateurs de Purebasic sous windows XP ..
faudrai faire un sondage, mais je pense pas qu'il y en ai plus de 4 ....

et que cela fait quand meme beaucoup de lignes de code pour une procedure qui n'affiche rien sous les OS moderne :mrgreen:
je suis moqueur ?? .... voyons voyons ..... ha ben ouaip :D carrement ! :lol:
tu me fait bien marrer avec tes métaphores

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 72 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 31 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye