OVH Cloud OVH Cloud

regex b w et internationalisation

7 réponses
Avatar
laurent courbez
bonjour à tous,


j'aimerais savoir si, dans les expressions régulières, le séparateur de
mots \b et la classe des lettres de l'alphabet (et un peu plus ...) \w
varient selon l'encodage. Plus concrètement,

si l'encodage est de l'ascii, alors "artère" devrait être vu "art" "re"
par "\b\w+\b",

si maintenant l'encodage est de l'iso-8859-1, alors "artère" devrait
être vu "artère" par "\b\w+\b".

S'il varie effectivement selon l'encodage, comment préciser l'encodage
avec lequel on veut travailler.


Merci d'avance.

LC.

7 réponses

Avatar
Zoury
Salut Laurent! :O)

C'est une bonne question!

Si tu n'optiens pas de réponse ou si tu veux tester toi même, regarde du
côté de la classe System.Text.Encoding qui te permettra de modifier
l'encodage d'une chaine. Tu pourras ainsi faire des tests, répondre à ta
question et nous informer de la réponse. ;O)

--
Cordialement
Yanick
MVP pour Visual Basic
j'aimerais savoir si, dans les expressions régulières, le séparateur de
mots b et la classe des lettres de l'alphabet (et un peu plus ...) w
varient selon l'encodage. Plus concrètement,

si l'encodage est de l'ascii, alors "artère" devrait être vu "art" "re"
par "bw+b",

si maintenant l'encodage est de l'iso-8859-1, alors "artère" devrait
être vu "artère" par "bw+b".

S'il varie effectivement selon l'encodage, comment préciser l'encodage
avec lequel on veut travailler.


Merci d'avance.

LC.


Avatar
Sylvain Collange
laurent courbez a écrit :
j'aimerais savoir si, dans les expressions régulières, le séparateur
de mots b et la classe des lettres de l'alphabet (et un peu plus
...) w varient selon l'encodage.



Il n'y a qu'un seul encodage sous .NET, c'est Unicode UTF-16.

En ce qui concerne les Regex, d'après la doc w correspond au
catégories Unicode Ll (lettre minuscule), Lu (lettre majuscule), Lt
(lettre capitale), Lo (lettre, autre), Nd (nombre décimal) et Pc
(ponctuation, connecteur)

Par contre ça n'inclut pas la catégorie Mn, celle des accents
combinants.
Donc suivant comment « artère » est codé, il sera reconnu comme un
seul ou bien deux mots.

En remplaçant w par
[p{Ll}p{Lu}p{Lt}p{Lm}p{Lo}p{Nd}p{Pc}p{Mn}], on ne devrait pas
avoir ce problème.

--
Sylvain Collange
Avatar
Zazar
Bonsoir,

j'aimerais savoir si, dans les expressions régulières, le séparateur
de mots b et la classe des lettres de l'alphabet (et un peu plus
...) w varient selon l'encodage. Plus concrètement,

si l'encodage est de l'ascii, alors "artère" devrait être vu "art"
"re" par "bw+b",

si maintenant l'encodage est de l'iso-8859-1, alors "artère" devrait
être vu "artère" par "bw+b".

S'il varie effectivement selon l'encodage, comment préciser l'encodage
avec lequel on veut travailler.



C'est un faux problème : définir un encodage n'a de sens que lorsqu'on
manipule des données binaires (un tableau de bytes) représentant une chaîne
de caractères. A ce moment là, on a besoin d'un encodage pour décréter que
telle ou telle combinaison d'octets représentent tel ou tel caractère.
Si vous manipulez directement une chaines de caractères (System.String)
alors la notion d'encodage n'intervient plus (enfin elle intervient pour la
représentation interne de la string, mais on n'a pas besoin de le savoir)
puisqu'on connaît tous les caractères parfaitement.
Les regex manipulent directement des string et il est défini que le
cararctère é matche w, et ça ne changera pas. Par contre si vous avez la
représentation binaire iso-8859-1 de la chaîne "artère" et que vous lisez
cette représentation en utilisant l'encodage ascii, vous allez obtenir une
chaîne du type "art?re" qui sera effectivement découpé en 2 sous groupes.
Mais cette chaîne n'est pas la chaîne "artère"! C'est une chaîne quelconque
qui contient les caractères 'a', 'r', 't', un caractère unicode quelconque,
'r', 'e' et qui a la particularité de pouvoir se transformer en la chaîne
"artère" via de sombres manipulations :).

En fait, le vrai problème, c'est qu'au moment où on crée la chaîne (quand on
la lit depuis le disque dur par exemple) à partir de données binaires, il
faut utiliser le bon encodage. Sinon on se met à manipuler une chaîne
différente de celle qu'on aurait voulu.

--
Zazar
Avatar
laurent courbez
merci pour cette éclairage,
j'ai effectué des tests qui vont effectivement dans ce sens

LC.


Zazar a écrit :
Bonsoir,


j'aimerais savoir si, dans les expressions régulières, le séparateur
de mots b et la classe des lettres de l'alphabet (et un peu plus
...) w varient selon l'encodage. Plus concrètement,

si l'encodage est de l'ascii, alors "artère" devrait être vu "art"
"re" par "bw+b",

si maintenant l'encodage est de l'iso-8859-1, alors "artère" devrait
être vu "artère" par "bw+b".

S'il varie effectivement selon l'encodage, comment préciser l'encodage
avec lequel on veut travailler.




C'est un faux problème : définir un encodage n'a de sens que lorsqu'on
manipule des données binaires (un tableau de bytes) représentant une chaîne
de caractères. A ce moment là, on a besoin d'un encodage pour décréter que
telle ou telle combinaison d'octets représentent tel ou tel caractère.
Si vous manipulez directement une chaines de caractères (System.String)
alors la notion d'encodage n'intervient plus (enfin elle intervient pour la
représentation interne de la string, mais on n'a pas besoin de le savoir)
puisqu'on connaît tous les caractères parfaitement.
Les regex manipulent directement des string et il est défini que le
cararctère é matche w, et ça ne changera pas. Par contre si vous avez la
représentation binaire iso-8859-1 de la chaîne "artère" et que vous lisez
cette représentation en utilisant l'encodage ascii, vous allez obtenir une
chaîne du type "art?re" qui sera effectivement découpé en 2 sous groupes.
Mais cette chaîne n'est pas la chaîne "artère"! C'est une chaîne quelconque
qui contient les caractères 'a', 'r', 't', un caractère unicode quelconque,
'r', 'e' et qui a la particularité de pouvoir se transformer en la chaîne
"artère" via de sombres manipulations :).

En fait, le vrai problème, c'est qu'au moment où on crée la chaîne (quand on
la lit depuis le disque dur par exemple) à partir de données binaires, il
faut utiliser le bon encodage. Sinon on se met à manipuler une chaîne
différente de celle qu'on aurait voulu.

--
Zazar




Avatar
Manu
Bonjour,

A partir d'un exemple concret, comment ça marche ?
Machaine = "español"
j'aimerai la mettre au format que html reconnais (mais sans mettre de Meta
dans la page web puisque mon resultat n'est pas pour une page web)
Machaine_resultante = "español"
et cela pour plusieurs caracteres (parce exemple toute une ligne de texte)

je suppose que les deux classes System.Text.Encoding et RegEx sont
solicitées mais comment ?
Un exemple en VB.net serai apprecié ou un lien sur le wouaib.
Merci.




"laurent courbez" a écrit dans le message de
news: 41dd3231$0$22726$
bonjour à tous,


j'aimerais savoir si, dans les expressions régulières, le séparateur de
mots b et la classe des lettres de l'alphabet (et un peu plus ...) w
varient selon l'encodage. Plus concrètement,

si l'encodage est de l'ascii, alors "artère" devrait être vu "art" "re"
par "bw+b",

si maintenant l'encodage est de l'iso-8859-1, alors "artère" devrait être
vu "artère" par "bw+b".

S'il varie effectivement selon l'encodage, comment préciser l'encodage
avec lequel on veut travailler.


Merci d'avance.

LC.


Avatar
Zazar
Bonsoir,

A partir d'un exemple concret, comment ça marche ?
Machaine = "español"
j'aimerai la mettre au format que html reconnais (mais sans mettre de
Meta dans la page web puisque mon resultat n'est pas pour une page
web) Machaine_resultante = "español"
et cela pour plusieurs caracteres (parce exemple toute une ligne de
texte)



Si vous voulez le faire à la main, de simples Replace() suffisent. Pour une
méthode plus rapide, vous prenez un StringBuilder, et vous traitez tous les
caractères de votre chaîne d'entrée 1 à 1 pour remplir le StringBuilder.
Si ce que vous voulez est totalement équivalent à un encodage html, vous
pouvez utiliser la méthode System.Web.HttpUtility.HtmlEncode().

je suppose que les deux classes System.Text.Encoding et RegEx sont
solicitées mais comment ?



Il y a effectivement de l'encodage dans ce que vous cherchez, mais ce n'est
pas un encodage au sens de celui traité dans System.Text.Encoding.
Quant aux RegEx, elles pourraient servir à faire le travail, mais ce n'est
pas ce qu'il y a de plus adapté.

Un exemple en VB.net serai apprecié ou un lien sur le wouaib.


Regardez la MSDN.

--
Zazar
Avatar
Manu
Non mais en fait y'avais plus simple..
Suffit d'utiliser HtmlUtility.HtmlEncode(MaChaine)

"Manu" a écrit dans le message de news:
41e299e7$0$7894$
Bonjour,

A partir d'un exemple concret, comment ça marche ?
Machaine = "español"
j'aimerai la mettre au format que html reconnais (mais sans mettre de Meta
dans la page web puisque mon resultat n'est pas pour une page web)
Machaine_resultante = "español"
et cela pour plusieurs caracteres (parce exemple toute une ligne de texte)

je suppose que les deux classes System.Text.Encoding et RegEx sont
solicitées mais comment ?
Un exemple en VB.net serai apprecié ou un lien sur le wouaib.
Merci.




"laurent courbez" a écrit dans le message de
news: 41dd3231$0$22726$
bonjour à tous,


j'aimerais savoir si, dans les expressions régulières, le séparateur de
mots b et la classe des lettres de l'alphabet (et un peu plus ...) w
varient selon l'encodage. Plus concrètement,

si l'encodage est de l'ascii, alors "artère" devrait être vu "art" "re"
par "bw+b",

si maintenant l'encodage est de l'iso-8859-1, alors "artère" devrait être
vu "artère" par "bw+b".

S'il varie effectivement selon l'encodage, comment préciser l'encodage
avec lequel on veut travailler.


Merci d'avance.

LC.