Si on veut créer des URL correctes dans Word, il est nécessaire d'encoder convenablement tout ce qui n'est pas un caractère ASCII.
Pour tous les caractères de plus de 7 bits, il faut utiliser le codage UTF8.
Voir à ce sujet l'exellente page de Wikipedia
http://fr.wikipedia.org/wiki/Utf8
Cette fontion n'existe pas en VB6. J'en ai écrit une, EncodeUTF8 ci-dessous, qui à l'air de bien marcher.
Nota pour les curieux :
Il y a des bien fonctions pour cela en .net, mais depuis les applications Office (même Office 2007 !), c'est du VB6 qui est utilisé pour programmer les macros.
Au hasard, copier, coller, sélectionner dans Word un peu de Chinois pour essayer
西藏精神领袖达赖喇嘛八日呼吁藏人冷静
Source / Exemple :
Sub Google()
'
' Google Macro
' Macro enregistrée le 21/02/2008 par VBsnail
Dim Utf8 As String
TexteSelectionne = ""
Text = Selection.Text
i = 1
For i = 1 To Len(Text)
car = Mid(Text, i, 1)
TexteSelectionne = TexteSelectionne + EncodeUTF8(car)
Next i
'debug MsgBox (TexteSelectionne)
' %22 c'est le guillement " à mettre en début et en fin de chaîne pour forcer la recherche Google sur la chaîne entière
URL = "http://www.google.com/search?q=%22" & TexteSelectionne & "%22"
' MsgBox (Len(URL))
' Attention, si la longueur dépassse 487, l'url transmise est tronquée.
' Limitation liée à la taille de l'URL que Word accepte d'associer au texte. A éclaircir
ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, Address:= _
URL, SubAddress:="", ScreenTip:="", _
TextToDisplay:=Selection.Text
End Sub
Public Function EncodeUTF8(ByVal car As String) As String
CarVal = AscW(car)
If CarVal < 0 Then CarVal = CarVal + 65536
'Ce IF, c'est pour éviter d'avoir un nombre négatif pour un code point >7fff
If CarVal < 128 Then 'Cas ASCII, codage sur 1 octet, 7 bits significatifs
EncodeUTF8 = car
Exit Function
End If
If CarVal < 2048 Then 'Cas du codage sur 2 octets, de 8 à 11 bits significatifs (5 bits puis 6 bits)
Sextet = 128 + CarVal Mod 64
CarVal = CarVal \ 64
Quintet = 192 + CarVal
EncodeUTF8 = "%" + Hex(Quintet) + "%" + Hex(Sextet)
Exit Function
End If
'cas du codage sur 3 octets, de 12 à 16 bits significatifs, (4 bits, 6 bits, 6bits)
Sextet2 = 128 + CarVal Mod 64
CarVal = CarVal \ 64
Sextet1 = 128 + CarVal Mod 64
CarVal = CarVal \ 64
Quartet = 224 + CarVal
EncodeUTF8 = "%" + Hex(Quartet) + "%" + Hex(Sextet1) + "%" + Hex(Sextet2)
' A ma connaisssnace, Windows ne gère pas de caractères Unicode au déla de U+FFFD, représenté par un rectangle vide
' de toutes façons, l'Unicode est codé sur 2 octets !!!
' Il n'est donc pas nécessaire de prévoir le cas du codage sur 4 octets
End Function
Conclusion :
Je sais, je sais, ce code n'est pas optimal, ni très propre.
mais enfin il a l'air de marcher.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.