Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Enregistrement avec VB6 d'un caractère dit unicode dans un fichi er TXT

10 réponses
Avatar
Kiriasse
Bonjour,

J'essaye de comprendre un peu en manipulant cette histoire de caractères
unicodes...
Je suis sous Windows XP.
Si vous acceptez d'essayer de m'aider, vous pouvez faire, si vous le voulez
bien, les manipulations suivantes :
1) Activer Charmap.exe et sélectionner la police de caractères « Lucida Sans
Unicode ».

2) Dans Charmap, choisir le caractère « (guillemet français ouvrant) et
cliquer sur le bouton « Sélectionner ».
On voit apparaître en bas et à gauche l'indication « U + 00AB ».
On voit apparaître en bas et à droite l'indication « Alt + 0171 ».

3) Dans Charmap, choisir le caractère bécarre (dans le bas de la grille,
entre les caractères bémol et dièse) et cliquer sur le bouton «
Sélectionner ».
On voit apparaître en bas et à gauche l'indication « U + 266E ».
On ne voit rien apparaître en bas et à droite.

4) Dans Charmap, les deux caractères guillemet français ouvrant et bécarre
étant sélectionnés, cliquer sur le bouton « Copier ».

5) Ouvrir Notepad et choisir la police de caractères « Lucida Sans
Unicode ».

6) Dans le nouveau document ouvert dans Notepad, coller les deux caractères
en question.
On les voit apparaître correctement : guillemet français ouvrant et bécarre.

J'en arrive à Visual Basic 6 :
Open "C:\MonRep\Test.txt" For Output As #1
Print #1, Chr$(171)
Close #1

Ouvrir Test.txt avec Notepad. On voit que le caractère « (guillemet français
ouvrant) y est bien présent.

MA QUESTION
Que faut-il écrire après la ligne Print #1, Chr$(171) pour que s'enregistre
le caractère bécarre dans Test.txt ?

MERCI POUR VOTRE AIDE.

10 réponses

Avatar
François Picalausa
On Jan 19, 3:32 pm, "Kiriasse" <http://www.kiriasse.fr/mailtokir/
mailtokir.html> wrote:
Bonjour,

J'essaye de comprendre un peu en manipulant cette histoire de caractères
unicodes...
<snip>
MA QUESTION
Que faut-il écrire après la ligne Print #1, Chr$(171) pour que s'enreg istre
le caractère bécarre [« U + 266E »] dans Test.txt ?



Hello,

Ca dépend! Même si on parle généralement d'encodage Unicode (à tor t)
pour désigner UTF-16, tu as un large choix d'encodages (UTF-7, UTF-8,
UTF-32, pour n'en citer que quelques uns) pour représenter les
codepoints Unicode dans un flux de données quelconque.

Je te conseille de consulter ce document:
http://unicode.org/faq/utf_bom.html#14

Par exemple, pour écrire les deux caractères mentionnés en UTF-16,
avec Byte Order Mark (BOM) pour petit-boutiste (ou petit-boutien ou
little-endian)
Dim Data(5) As Byte
'6 (dimension de Data) =
' 2 bytes pour le BOM
' 1x 16 bits pour le premier caractère
' 1x 16 bits pour le second caractère

'BOM (little endian)
Data(0) = &HFF
Data(1) = &HFE

'00AB (171)
Data(2) = &HAB
Data(3) = 0

'266E
Data(4) = &H26
Data(5) = &H6E

Open "C:UsersFrançoisDesktoptest.txt" For Binary As #1
Put #1, , Data
Close #1

François
Avatar
Jean-marc
François Picalausa wrote:
On Jan 19, 3:32 pm, "Kiriasse" <http://www.kiriasse.fr/mailtokir/
mailtokir.html> wrote:



<snip>

Par exemple, pour écrire les deux caractères mentionnés en UTF-16,
avec Byte Order Mark (BOM) pour petit-boutiste (ou petit-boutien ou
little-endian)
Dim Data(5) As Byte
'6 (dimension de Data) > ' 2 bytes pour le BOM
' 1x 16 bits pour le premier caractère
' 1x 16 bits pour le second caractère

'BOM (little endian)
Data(0) = &HFF
Data(1) = &HFE

'00AB (171)
Data(2) = &HAB
Data(3) = 0

'266E
Data(4) = &H26
Data(5) = &H6E

Open "C:UsersFrançoisDesktoptest.txt" For Binary As #1
Put #1, , Data
Close #1

François



Sniff, qu'il était doux le temps de l'US-ASCII 7bits

<private>
et de l'EBCDIC ...
</private>

Sniff ...

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Kiriasse
Merci François,

Mais... ça ne marche pas.
Bien que, dans NotePad, la police « Lucida Sans Unicode » soit active,
j'obtiens un petit carré au lieu du caractère bécarre attendu.
Une idée de correction de cette procédure ?
Merci d'avance.
Jean-Claude (alias Kiriasse)
Répondant à

== "François Picalausa"
Ca dépend! Même si on parle généralement d'encodage Unicode (à tort)
pour désigner UTF-16, tu as un large choix d'encodages (UTF-7, UTF-8,
UTF-32, pour n'en citer que quelques uns) pour représenter les
codepoints Unicode dans un flux de données quelconque.

Je te conseille de consulter ce document:
http://unicode.org/faq/utf_bom.html#14

Par exemple, pour écrire les deux caractères mentionnés en UTF-16,
avec Byte Order Mark (BOM) pour petit-boutiste (ou petit-boutien ou
little-endian)
Dim Data(5) As Byte
'6 (dimension de Data) ' 2 bytes pour le BOM
' 1x 16 bits pour le premier caractère
' 1x 16 bits pour le second caractère

'BOM (little endian)
Data(0) = &HFF
Data(1) = &HFE

'00AB (171)
Data(2) = &HAB
Data(3) = 0

'266E
Data(4) = &H26
Data(5) = &H6E

Open "C:UsersFrançoisDesktoptest.txt" For Binary As #1
Put #1, , Data
Close #1

François
Avatar
François Picalausa
On Jan 19, 5:18 pm, "Kiriasse" <http://www.kiriasse.fr/mailtokir/
mailtokir.html> wrote:
Merci François,

Mais... ça ne marche pas.
Bien que, dans NotePad, la police « Lucida Sans Unicode » soit active,
j'obtiens un petit carré au lieu du caractère bécarre attendu.
Une idée de correction de cette procédure ?
    '00AB (171)
    Data(2) = &HAB
    Data(3) = 0

    '266E
    Data(4) = &H26
    Data(5) = &H6E





Hello,
L'erreur vient de l'oubli d'inversion dans le second cas. Il fallait
lire (comprendre, j'aurais du éviter de modifier l'exemple juste avant
de le poster):
'266E
Data(4) = &H6E
Data(5) = &H26

J'ai pour ma part fait le test avec 222B (intégrale):
'222B
Data(4) = &H2B
Data(5) = &H22
Mais logiquement, ça devrait fonctionner...

François
Avatar
Kiriasse
Merci. J'aurais dû m'en apercevoir !
J'ai bien obtenu mon bécarre dans Test.txt.
Ce que je voudrais maintenant obtenir, c'est le copier dans le
presse-papiers de façon à pouvoir le coller ensuite n'importe où, par
exemple dans un nouveau message d'Outlook (je suis souvent en relation par
courriel avec des musiciens et les trois signes dièse, bécarre et bémol me
manquent).

J'ai donc essayé ce qui suit :
<--->
Dim Data(4) As Byte
Dim sCar As String

'BOM (little endian)
Data(0) = &HFF
Data(1) = &HFE

'266E (bécarre)
Data(2) = &H6E
Data(3) = &H26

Open "C:Atest.txt" For Output As #1
Close #1

Open "C:Atest.txt" For Binary As #1
Put #1, , Data
Close #1

Open "C:Atest.txt" For Input As #1
Input #1, sCar
Close #1

Clipboard.Clear
Clipboard.SetText sCar

End
<--->

Mais ça ne marche pas. Au lieu du bécarre espéré, j'obtiens dans le
presse-papiers plusieurs caractères exotiques.
Pouvez-vous encore m'aider à obtenir ce que je souhaite obtenir ?
Vous aurez droit au paradis des programmeurs à la fin de vos jours (le plus
tard possible bien entendu).
Avatar
Kiriasse
Oui. Et de Quick Basic et Works (tous deux sous DOS) avec lesquels j'ai pu
traiter des données pour une étude statistique illustrant un mémoire de
D.E.A., quelques années avant la retraite.
Kiriasse
Répondant à

== "Jean-marc"
Sniff, qu'il était doux le temps de l'US-ASCII 7bits
Avatar
François Picalausa
On Jan 19, 6:29 pm, "Kiriasse" <http://www.kiriasse.fr/mailtokir/
mailtokir.html> wrote:
Merci. J'aurais dû m'en apercevoir !
J'ai bien obtenu mon bécarre dans Test.txt.
Ce que je voudrais maintenant obtenir, c'est le copier dans le
presse-papiers de façon à pouvoir le coller ensuite n'importe où, pa r
exemple dans un nouveau message d'Outlook (je suis souvent en relation par
courriel avec des musiciens et les trois signes dièse, bécarre et bé mol me
manquent).

J'ai donc essayé ce qui suit :
<--->
Dim Data(4) As Byte
Dim sCar As String

'BOM (little endian)
Data(0) = &HFF
Data(1) = &HFE

'266E (bécarre)
Data(2) = &H6E
Data(3) = &H26

Open "C:Atest.txt" For Output As #1
Close #1

Open "C:Atest.txt" For Binary As #1
        Put #1, , Data
Close #1

Open "C:Atest.txt" For Input As #1
    Input #1, sCar
Close #1

Clipboard.Clear
Clipboard.SetText sCar

End
<--->

Mais ça ne marche pas. Au lieu du bécarre espéré, j'obtiens dans l e
presse-papiers plusieurs caractères exotiques.
Pouvez-vous encore m'aider à obtenir ce que je souhaite obtenir ?
Vous aurez droit au paradis des programmeurs à la fin de vos jours (le p lus
tard possible bien entendu).




Hello,

Le problème est que ce code définit correctement CF_TEXT, mais c'est
le texte unicode qu'on souhaite définir. La solution suivante
fonctionne (en définissant CF_UNICODETEXT comme format de données),
mais je ne suis pas certain que ce soit la manière la plus simple de
procéder:
Option Explicit

Private Const CF_UNICODETEXT As Long = 13
Private Const GMEM_MOVEABLE As Long = &H2

Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As
Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat
As Long, ByVal hMem As Long) As Long

Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As
Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As
Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As
Long) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias
"RtlMoveMemory" (pTo As Any, uFrom As Any, ByVal lSize As Long)

Private Sub Command1_Click()
Dim Data(6) As Byte
Dim str As String

'BOM (little endian)
Data(0) = &HFF
Data(1) = &HFE


'266E (bécarre)
Data(2) = &H6E
Data(3) = &H26

'EOS
Data(4) = &H0
Data(5) = &H0


Clipboard.Clear

SetClipData Data, CF_UNICODETEXT
End Sub

Public Sub SetClipData(Data() As Byte, Format As Long)
Dim hGlobalData As Long
Dim pGlobalData As Long
Dim Size As Long

' If SetClipboardData succeeds, the system owns the object
identified by the
' hMem parameter. The application may not write to or free the
data once
' ownership has been transferred to the system, but it can lock
and read
' from the data until the CloseClipboard function is called.
' (The memory must be unlocked before the Clipboard is closed.)
' If the hMem parameter identifies a memory object, the object
must have been
' allocated using the function with the GMEM_MOVEABLE flag.

If OpenClipboard(0) Then
' Copie les données en mémoire globale
Size = UBound(Data) - LBound(Data) + 1
hGlobalData = GlobalAlloc(GMEM_MOVEABLE, Size)
If hGlobalData Then
'Copie les données dans notre buffer global
pGlobalData = GlobalLock(hGlobalData)
CopyMemory ByVal pGlobalData, Data(0), Size
GlobalUnlock hGlobalData

'Définit les données
SetClipboardData Format, hGlobalData
End If

CloseClipboard
End If
End Sub


François
Avatar
Jean-marc
François Picalausa wrote:

Hello,

Le problème est que ce code définit correctement CF_TEXT, mais c'est
le texte unicode qu'on souhaite définir. La solution suivante
fonctionne (en définissant CF_UNICODETEXT comme format de données),
mais je ne suis pas certain que ce soit la manière la plus simple de
procéder:



<snip>

Je suis arrivé au même code, donc pas plus simple pour moi non plus ...

Comme UNICODETEXT n'est pas suppprté par le clipboard de VB, je
ne pense pas qu'on puisse faire autrement que comme tu as fait
(et moi aussi).

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Kiriasse
C'est assez étonnant votre code. Et ça marche très bien !
Je ne m'en serais pas sortit tout seul (à moins de trouver un exemple
analogue sur un site Internet).
Un grand merci.
Jean-Claude

== "François Picalausa"
Le problème est que ce code définit correctement CF_TEXT, mais c'est
le texte unicode qu'on souhaite définir. La solution suivante
fonctionne (en définissant CF_UNICODETEXT comme format de données),
mais je ne suis pas certain que ce soit la manière la plus simple de
procéder:
(...)
Avatar
Kiriasse
... sorti (sans t). J'ai mon clavier encrassé à force de taper des dièses,
des bécarres et des bémols...
Kiriasse
Se corrigeant

== "Kiriasse"
C'est assez étonnant votre code. Et ça marche très bien !
Je ne m'en serais pas sortit tout seul (à moins de trouver un exemple
analogue sur un site Internet).
Un grand merci.
Jean-Claude