PeekANSI() - Lire de l'ASCII accentué en Unicode
Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
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
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)
Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
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.
Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
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 :
ce qui donne ceci :
donc la procedure :
remplace avantageusement celle D'Olivier (en taille du moins ) !
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
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
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).
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)
Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
lire la suite ......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.
le probleme est bien là !! ,car ton code plante ligne 31En 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).
alors .... qui se gamelle ???
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
@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).
Ç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à!).
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
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à!).
Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
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) :
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
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
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)
Mesa.
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
Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
@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!
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
- JohnJohnsonSHERMAN
- Messages : 648
- Inscription : dim. 13/déc./2015 11:05
- Localisation : Allez, cherche...
- Contact :
Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
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...
(et merci a mon prof d'info, c'était le sujet du cours d'hier )
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...
(et merci a mon prof d'info, c'était le sujet du cours d'hier )
"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
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é
Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
@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 :
voici avec ta datasection , comment je fait sous Seven , PB5.50 et un gadget editeur (ben oui faut vivre avec sont temp )
et voici le resultat sous Gadget editeur et Debugger
Mesa a donné la Vraie solution , c'est effectivement de charger la bonne fonte
ce qui rends ta procedure "universel" completement inutile
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
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 :
mais bon c'est pas trop grave, ça m'empeche pas de dormir(pas jouer avec restore: les programmes externes ne connaissent pas ça)
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
Mesa a donné la Vraie solution , c'est effectivement de charger la bonne fonte
ce qui rends ta procedure "universel" completement inutile
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
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
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
Trouvez-vous les mêmes résultats ??
A+
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.
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
Comme ça, c'est fait...Zorro a écrit :c'est toi qui ne comprends pas tout
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
- JohnJohnsonSHERMAN
- Messages : 648
- Inscription : dim. 13/déc./2015 11:05
- Localisation : Allez, cherche...
- Contact :
Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
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
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
"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
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é
Re: PeekANSI() - Lire de l'ASCII accentué en Unicode
donc ce qui reviens a ceci , c'est a dire en ajoutant ta procedure qui manque a tout tes codesOllivier a écrit :Zorro a écrit : En attendant, j'ai modifié ton code:
PeekS en PeekANSI, peut-être que tu comprendras la subtilité...
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
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
je suis moqueur ?? .... voyons voyons ..... ha ben ouaip carrement !
tu me fait bien marrer avec tes métaphores
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"