OVH Cloud OVH Cloud

Un moyen simple de remplacer les caractères accentués dans une string...

12 réponses
Avatar
Christian HUBERT-HUGOUD- Xtrem7
Bonjour,

Je récupère une string qui doit être un futur nom de fichier php. Or, les
accents sont très mal gérés en php.

Je voudrais donc remplacer les caractères accentués par leur homologue
non-accentué (é devient e, à devient a, etc).

Existe-t-il une façon simple de faire cela ?

Christian

10 réponses

1 2
Avatar
le_troll
Bonjour,

Sur le principe je pense que tu peux faire ainsi, mais il devrait y
avoir plusieurs méthodes:

-1- Teste du texte (tout ou partie) dans une variable
-2- Extraction de chaque caractère en notant sa position et le caractère (2
variables)
-3- Par un select case, déterminer si le caractère doit être pris en compte,
à quelle famille il appartient (a,e)...
-4- Dans le select case, si caractère retenu, le transformer par celui voulu
dans la chaîne (caractère + position)

Tu peux aussi par les instructions de chaîne, faire une boucle pour tester
chaque cas à remplacer, et le remplacer directement si trouvé -> voir les
instructions de chaînes, si tu veux plus de détails demande :o)

--
Merci, @+, bye, Joe
troll75 AROBASE iFrance POINT com
------------------------------------------
Ce message est plein de virus "certifiés"
Le_Troll, éleveur de Trolls depuis César, qui disait:
Avec une hache, celui qui tient le manche a toujours raison !
------------------------------------------


"Christian HUBERT-HUGOUD- Xtrem7" a écrit dans
le message de news: cdls0c$51$
Bonjour,

Je récupère une string qui doit être un futur nom de fichier php. Or, les
accents sont très mal gérés en php.

Je voudrais donc remplacer les caractères accentués par leur homologue
non-accentué (é devient e, à devient a, etc).

Existe-t-il une façon simple de faire cela ?

Christian




Avatar
Zoury
Salut Christian ! :O)

Tu peux te faire une fonction qui boucle les caractères un à un et le
remplace par sa version non accentué...

Private Sub RemoveAccent(ByRef sChaine As String)

Dim i As Long
Dim c As String

For i = 1 To Len(sChaine)
Select Case Mid$(sChaine, i, 1)
Case "à", "â", "ä"
Mid$(sChaine, i, 1) = "a"
Case Else ' ajoute le reste... (et les majuscules ;O) )
End Select
Next i

End Sub

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
"Christian HUBERT-HUGOUD- Xtrem7" a écrit dans
le message de news:cdls0c$51$
Bonjour,

Je récupère une string qui doit être un futur nom de fichier php. Or, les
accents sont très mal gérés en php.

Je voudrais donc remplacer les caractères accentués par leur homologue
non-accentué (é devient e, à devient a, etc).

Existe-t-il une façon simple de faire cela ?

Christian




Avatar
Vincent Guichard
Zoury a écrit :
Mid$(sChaine, i, 1) = "a"



Tiens, je savais pas qu'on pouvait utiliser Mid$ comme l-value... C'est
pratique, ça.

Par contre ça marche pas pour Left$ et Right$ ?

Vincent Guichard
Avatar
Zoury
> Tiens, je savais pas qu'on pouvait utiliser Mid$ comme l-value... C'est
pratique, ça.



et beaucoup plus rapide !! ;O)
mais on ne peut le faire qu'avec Mid$().. mais objectivement Mid$() peut
faire tous ce que Left$() et Right$() font..

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

"Vincent Guichard" a écrit dans le message de
news:cdm2ug$usk$
Zoury a écrit :
> Mid$(sChaine, i, 1) = "a"


Par contre ça marche pas pour Left$ et Right$ ?

Vincent Guichard


Avatar
David
Bonjour Christian,

Voila qui devrait faire l'affaire :

Public Function ReplaceSpecialChars(ByVal arg_String As String, Optional
ByVal arg_SpecialChar As String = "âäàêëéèîïôöûüùç", _
Optional ByVal arg_ReplaceChar As String = "aaaeeeeiioouuuc",
Optional ConvertUpperCase As Boolean = True) As String
Dim intI As Integer, intMax As Integer, strTemp As String

intMax = IIf(Len(arg_SpecialChar) < Len(arg_ReplaceChar) Or
arg_ReplaceChar = "", Len(arg_SpecialChar), Len(arg_ReplaceChar))

For intI = 1 To intMax
strTemp = IIf(arg_ReplaceChar = "", "", Mid(arg_ReplaceChar, intI,
1))
arg_String = Replace(arg_String, Mid(arg_SpecialChar, intI, 1),
strTemp)
Next intI
If ConvertUpperCase Then arg_String = ReplaceSpecialChars(arg_String,
UCase(arg_SpecialChar), UCase(arg_ReplaceChar), False)
ReplaceSpecialChars = arg_String
End Function



a+
Jean-Pol DAVID
mailto:
ICQ 28394733
--
Quis ? Quid ? Ubi ? Quibus auxiliis ? Cur ? Quomodo ? Quando ?
"Christian HUBERT-HUGOUD- Xtrem7" a écrit dans
le message de news: cdls0c$51$
Bonjour,

Je récupère une string qui doit être un futur nom de fichier php. Or, les
accents sont très mal gérés en php.

Je voudrais donc remplacer les caractères accentués par leur homologue
non-accentué (é devient e, à devient a, etc).

Existe-t-il une façon simple de faire cela ?

Christian




Avatar
Zoury
Salut David! :O)

L'idée d'employer des chaines au lieu d'un select case n'est pas mauvaise du
tout.. :O)
je crois toutefois que la version suivante serait plus rapide :
'***
Option Explicit

Private Sub Main()
Debug.Print RemoveAccent("Boîte de réception")
End Sub

Private Function RemoveAccent(ByVal sText As String) As String

Const ACCENTUATED_CHARSET As String "âäàêëéèîïìôöòûüùçÂÄÀÊËÉÈÎÏÌÔÖÒÛÜÙÇ"
Const REPLACEMENT_CHARSET As String "aaaeeeeiiiooouuucAAAEEEEIIIOOOUUUC"
Dim i As Long
Dim lPos As Long

For i = 1 To Len(ACCENTUATED_CHARSET)
lPos = InStr(sText, Mid$(ACCENTUATED_CHARSET, i, 1))
If (lPos > 0) Then
Mid$(sText, lPos, 1) = Mid$(REPLACEMENT_CHARSET, i, 1)
End If
Next i
RemoveAccent = sText

End Function
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
David
Bonjour Zoury,

Ta programmation est tout
simplement génial !
Ici, en Belgique, c'est la fête nationale
(21 juillet) alors scrute le ciel, il y
aura sûrement,ce soir, un feu d'artifice
tiré en ton honneur !

a+
Jean-Pol DAVID
mailto:
ICQ 28394733
--
Quis ? Quid ? Ubi ? Quibus auxiliis ? Cur ? Quomodo ? Quando ?
"Zoury" a écrit dans le message de news:
uRZ#
Salut David! :O)

L'idée d'employer des chaines au lieu d'un select case n'est pas mauvaise


du
tout.. :O)
je crois toutefois que la version suivante serait plus rapide :
'***
Option Explicit

Private Sub Main()
Debug.Print RemoveAccent("Boîte de réception")
End Sub

Private Function RemoveAccent(ByVal sText As String) As String

Const ACCENTUATED_CHARSET As String > "âäàêëéèîïìôöòûüùçÂÄÀÊËÉÈÎÏÌÔÖÒÛÜÙÇ"
Const REPLACEMENT_CHARSET As String > "aaaeeeeiiiooouuucAAAEEEEIIIOOOUUUC"
Dim i As Long
Dim lPos As Long

For i = 1 To Len(ACCENTUATED_CHARSET)
lPos = InStr(sText, Mid$(ACCENTUATED_CHARSET, i, 1))
If (lPos > 0) Then
Mid$(sText, lPos, 1) = Mid$(REPLACEMENT_CHARSET, i, 1)
End If
Next i
RemoveAccent = sText

End Function
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/




Avatar
Zoury
> Ici, en Belgique, c'est la fête nationale
(21 juillet) alors scrute le ciel, il y
aura sûrement,ce soir, un feu d'artifice
tiré en ton honneur !



Haha! J'suis au québec... Je vais malheureusement manquer ça ;O)

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
François Picalausa
Hello,

J'peux y aller à coup d'APIs?

Private Declare Function LCMapString _
Lib "Kernel32" _
Alias "LCMapStringA" _
( _
ByVal Locale As Long, _
ByVal dwMapFlags As Long, _
ByVal lpSrcStr As String, _
ByVal cchSrc As Long, _
ByVal lpDestStr As String, _
ByVal cchDest As Long _
) _
As Long

Private Enum NORM
NORM_IGNORECASE = &H1
NORM_IGNOREKANATYPE = &H10000
NORM_IGNORENONSPACE = &H2
NORM_IGNORESYMBOLS = &H4
NORM_IGNOREWIDTH = &H20000
End Enum

Private Sub Command1_Click()
MsgBox RemoveAccent("åãùêéè")
End Sub

Private Function RemoveAccent(strIn As String) As String
Dim DestString As String
Dim DestSize As Long

DestSize = LCMapString(0, NORM_IGNORENONSPACE, strIn, Len(strIn),
DestString, 0)
If DestSize Then
DestString = String$(DestSize, vbNullChar)

If LCMapString(0, NORM_IGNORENONSPACE, strIn, Len(strIn),
DestString, DestSize) Then
RemoveAccent = DestString
End If
End If
End Function

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Christian HUBERT-HUGOUD- Xtrem7" a écrit
dans le message de news:cdls0c$51$
Bonjour,

Je récupère une string qui doit être un futur nom de fichier php. Or,
les accents sont très mal gérés en php.

Je voudrais donc remplacer les caractères accentués par leur homologue
non-accentué (é devient e, à devient a, etc).

Existe-t-il une façon simple de faire cela ?

Christian


Avatar
François Picalausa
Hello,

juste une question, est-ce qu'il n'y a que le premier accent qui compte?

Debug.Print RemoveAccent("Boîte de réception et éléphants roses")

Je propose donc un:
Private Function RemoveAccent(ByVal sText As String) As String
Const ACCENTUATED_CHARSET As String = _
"âäàêëéèîïìôöòûüùçÂÄÀÊËÉÈÎÏÌÔÖÒÛÜÙÇ"
Const REPLACEMENT_CHARSET As String = _
"aaaeeeeiiiooouuucAAAEEEEIIIOOOUUUC"
Dim i As Long
Dim lPos As Long

For i = 1 To Len(ACCENTUATED_CHARSET)
lPos = InStr(sText, Mid$(ACCENTUATED_CHARSET, i, 1))
Do While (lPos > 0)
Mid$(sText, lPos, 1) = Mid$(REPLACEMENT_CHARSET, i, 1)
lPos = InStr(sText, Mid$(ACCENTUATED_CHARSET, i, 1))
Loop
Next i
RemoveAccent = sText

End Function

Mais personellement, je passe mes journées à mesurer des longueurs en
Ångström ( http://en.wikipedia.org/wiki/%C5ngstr%F6m - y en a qui n'ont rien
de mieux a faire, vous pensez? je confirme )
Mais apparement le Å n'est pas reconnu... pas plus que les õ...
Tout ça pour dire: ma fonction avec les api elle est mieux :-)

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Zoury" a écrit dans le message de
news:uRZ%
Salut David! :O)

L'idée d'employer des chaines au lieu d'un select case n'est pas
mauvaise du tout.. :O)
je crois toutefois que la version suivante serait plus rapide :


1 2