PeekANSI() - Lire de l'ASCII accentué en Unicode

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: PeekANSI() - Lire de l'ASCII accentué en Unicode

Message par GallyHC »

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 (http://www.purebasic.fr/french/viewtopi ... 81#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)
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: PeekANSI() - Lire de l'ASCII accentué en Unicode

Message par Ollivier »

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.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: PeekANSI() - Lire de l'ASCII accentué en Unicode

Message par Zorro »

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 : Tout sélectionner

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

ce qui donne ceci :

Code : Tout sélectionner

; 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 : Tout sélectionner

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"
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: PeekANSI() - Lire de l'ASCII accentué en Unicode

Message par Ollivier »

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 : Tout sélectionner

;{ 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) 
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: PeekANSI() - Lire de l'ASCII accentué en Unicode

Message par Zorro »

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:
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"
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: PeekANSI() - Lire de l'ASCII accentué en Unicode

Message par Ollivier »

@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 : Tout sélectionner

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à!).
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: PeekANSI() - Lire de l'ASCII accentué en Unicode

Message par Zorro »

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 : Tout sélectionner


;**************** 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"
Mesa
Messages : 1093
Inscription : mer. 14/sept./2011 16:59

Re: PeekANSI() - Lire de l'ASCII accentué en Unicode

Message par Mesa »

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 : Tout sélectionner

; 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.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: PeekANSI() - Lire de l'ASCII accentué en Unicode

Message par Ollivier »

@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 : Tout sélectionner

;****************************************************************
; 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 
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: PeekANSI() - Lire de l'ASCII accentué en Unicode

Message par JohnJohnsonSHERMAN »

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é
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: PeekANSI() - Lire de l'ASCII accentué en Unicode

Message par Zorro »

@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 :
(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 : Tout sélectionner

;****************************************************************

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"
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: PeekANSI() - Lire de l'ASCII accentué en Unicode

Message par PAPIPP »

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 : Tout sélectionner

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.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: PeekANSI() - Lire de l'ASCII accentué en Unicode

Message par Ollivier »

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 : Tout sélectionner

;****************************************************************
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
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: PeekANSI() - Lire de l'ASCII accentué en Unicode

Message par JohnJohnsonSHERMAN »

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é
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: PeekANSI() - Lire de l'ASCII accentué en Unicode

Message par Zorro »

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 : Tout sélectionner

;****************************************************************
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"
Répondre