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

ASP.NET : caractères non standard - équivalent binaire

4 réponses
Avatar
Gilbert Tordeur
Bonjour.

Existe-t-il une classe sous VB2008 qui permettrait de convertir tout
caractère spécial (lettre accentuée, etc) en son équivalent numérique (&#233
pour é) par exemple ?

Merci d'avance,
Gilbert

4 réponses

Avatar
Patrice
Bonjour,

Voir
http://msdn.microsoft.com/fr-fr/library/system.web.httpserverutility.htmlencode.aspx
(Server.HtmlEncode dans le "code-behind" d'une page ASPX...

Si cela ne semble pas faire l'affaire, préciser le contexte...

--
Patrice

"Gilbert Tordeur" a écrit dans le message de
groupe de discussion :
Bonjour.

Existe-t-il une classe sous VB2008 qui permettrait de convertir tout
caractère spécial (lettre accentuée, etc) en son équivalent numérique
(&#233 pour é) par exemple ?

Merci d'avance,
Gilbert



Avatar
Gilbert Tordeur
Bonjour Patrice, et merci pour ta réponse.

Mais elle ne résout pas mon souci, j'entre donc dans les détails :

J'ai une page ASP 2008 qui affiche une GridView, et un bouton permettant à
l'utilisateur de télécharger une feuille Excel avec le contenu de cette
GridView. En voici le code (à partir d'un exemple trouvé sur Internet) :

Private Sub BtnExportExcel_Click(ByVal sender As Object _
, ByVal e As System.EventArgs) _
Handles BtnExportExcel.Click
Call PreparerGrille(GvDemande)
Call ExporterGrille()
End Sub

Private Sub ExporterGrille()
' Exportation proprement dite
Dim FeuilleExcel As String = "attachment;
filenameÞmandesCaution.xls"
Response.ClearContent()
Response.AddHeader("content-disposition", FeuilleExcel)
Response.ContentType = "application/ms-excel"
Dim Sw = New StringWriter()
Dim Htw As HtmlTextWriter = New HtmlTextWriter(Sw)
' Créer une nouvelle Form pour contenir la grille
Dim F As New HtmlForm
GvDemande.RowStyle.BorderStyle = BorderStyle.NotSet
GvDemande.Parent.Controls.Add(F)
F.Attributes("runat") = "server"
F.Controls.Add(GvDemande)
F.RenderControl(Htw)
'GvDemande.RenderControl(Htw)
Dim s As String = Sw.ToString()
's = Server.HtmlEncode(s)
's = s.Replace("à", "&#232").Replace("é", "&#233").Replace("ë",
"&#235")
Response.Write(s)
Response.End()
End Sub

Private Sub PreparerGrille(ByVal c As Control)
' Préparation (changement de certaines colonnes)
For i As Integer = 0 To c.Controls.Count - 1
Dim ci As Control = c.Controls(i)
If TypeOf (ci) Is LinkButton Then
Dim Literal As New Literal
Literal.Text = DirectCast(ci, LinkButton).Text
c.Controls.Remove(ci)
c.Controls.AddAt(i, Literal)
ElseIf TypeOf (ci) Is HyperLink Then
Dim Literal As New Literal
Literal.Text = DirectCast(ci, HyperLink).Text
c.Controls.Remove(ci)
c.Controls.AddAt(i, Literal)
End If
If ci.HasControls Then
Call PreparerGrille(ci)
End If
Next
End Sub

À l'exécution, je constate que certains textes comportant des lettres
accentuées sont correctement affichés dans Excel, alors que d'autres pas.
L'utilisation de l'instruction «s = s.Replace("à", "&#232").Replace("é",
"&#233").Replace("ë", "&#235")» résout ce problème pour certains caractères,
mais la liste exhaustive des remplacements est longue et c'est pourquoi je
cherche une méthode toute faite.

Gilbert
Avatar
Patrice
Le problème est que seules les données sont à encoder pas l'intégralité de
la page sinon j'imagine que Excel affiche le code HTML de la page (car ce
n'est plus une page HTML !).

Il faudrait donc intervenir en amont au moment de l'affichage des données
par les contrôles présents dans la grille (je crois que les contrôles
"boundfield" comportent une propriété HtmlEncode qui permet de contrôler ce
comportement, cela pourrait expliquer la différence de comportement que tu
vois selon le contrôle utilisé pour afficher les données dans la grille).

Une autre solution pourrait être d'encadrer le code HTML envoyé par Excel
avec les balises html/body habituelles et de préciser dans une balise META
le jeu de caractères utilisé. Il se pourrait qu'Excel exploite cette
information (pas essayé). Pour tester ce dernier cas, le plus simple serait
sans doute de faire un bête fichier texte pour tester le principe...

--
Patrice


"Gilbert Tordeur" a écrit dans le message de
groupe de discussion :
Bonjour Patrice, et merci pour ta réponse.

Mais elle ne résout pas mon souci, j'entre donc dans les détails :

J'ai une page ASP 2008 qui affiche une GridView, et un bouton permettant à
l'utilisateur de télécharger une feuille Excel avec le contenu de cette
GridView. En voici le code (à partir d'un exemple trouvé sur Internet) :

Private Sub BtnExportExcel_Click(ByVal sender As Object _
, ByVal e As System.EventArgs) _
Handles BtnExportExcel.Click
Call PreparerGrille(GvDemande)
Call ExporterGrille()
End Sub

Private Sub ExporterGrille()
' Exportation proprement dite
Dim FeuilleExcel As String = "attachment;
filenameÞmandesCaution.xls"
Response.ClearContent()
Response.AddHeader("content-disposition", FeuilleExcel)
Response.ContentType = "application/ms-excel"
Dim Sw = New StringWriter()
Dim Htw As HtmlTextWriter = New HtmlTextWriter(Sw)
' Créer une nouvelle Form pour contenir la grille
Dim F As New HtmlForm
GvDemande.RowStyle.BorderStyle = BorderStyle.NotSet
GvDemande.Parent.Controls.Add(F)
F.Attributes("runat") = "server"
F.Controls.Add(GvDemande)
F.RenderControl(Htw)
'GvDemande.RenderControl(Htw)
Dim s As String = Sw.ToString()
's = Server.HtmlEncode(s)
's = s.Replace("à", "&#232").Replace("é", "&#233").Replace("ë",
"&#235")
Response.Write(s)
Response.End()
End Sub

Private Sub PreparerGrille(ByVal c As Control)
' Préparation (changement de certaines colonnes)
For i As Integer = 0 To c.Controls.Count - 1
Dim ci As Control = c.Controls(i)
If TypeOf (ci) Is LinkButton Then
Dim Literal As New Literal
Literal.Text = DirectCast(ci, LinkButton).Text
c.Controls.Remove(ci)
c.Controls.AddAt(i, Literal)
ElseIf TypeOf (ci) Is HyperLink Then
Dim Literal As New Literal
Literal.Text = DirectCast(ci, HyperLink).Text
c.Controls.Remove(ci)
c.Controls.AddAt(i, Literal)
End If
If ci.HasControls Then
Call PreparerGrille(ci)
End If
Next
End Sub

À l'exécution, je constate que certains textes comportant des lettres
accentuées sont correctement affichés dans Excel, alors que d'autres pas.
L'utilisation de l'instruction «s = s.Replace("à", "&#232").Replace("é",
"&#233").Replace("ë", "&#235")» résout ce problème pour certains
caractères, mais la liste exhaustive des remplacements est longue et c'est
pourquoi je cherche une méthode toute faite.

Gilbert



Avatar
Gilbert Tordeur
Bien vu !

Toutes mes colonnes BoundField sont bien affichées. Ce sont les
TemplateField qui posent problème, et elles ne disposent pas d'une propriété
HtmlEncode.

J'ai approfondi ton conseil d'encadrer le code HTML, et ça marche. Voir le
code ci-après.

Merci,
Gilbert

Private Const TxtHtmlDebut As String = "<html> " _
& "<head>" _
& "<meta http-equiv=""Content-Language"" content=""fr"">" _
& "<meta http-equiv=""content-type"" content=""text/html;
charset=UTF-8"" />" _
& "</head>" _
& "<body>"
Private Const TxtHtmlFin As String = "</body></html>"

Private Sub BtnExportExcel_Click(ByVal sender As Object _
, ByVal e As System.EventArgs) _
Handles BtnExportExcel.Click
Call PreparerGrille(GvDemande)
Call ExporterGrille()
End Sub

Private Sub ExporterGrille()
' Exportation proprement dite
Dim FeuilleExcel As String = "attachment;
filenameÞmandesCaution.xls"
Response.ClearContent()
Response.AddHeader("content-disposition", FeuilleExcel)
Response.ContentType = "application/ms-excel"
Dim Sw = New StringWriter()
Dim Htw As HtmlTextWriter = New HtmlTextWriter(Sw)
' Créer une nouvelle Form pour contenir la grille
Dim F As New HtmlForm
GvDemande.RowStyle.BorderStyle = BorderStyle.NotSet
GvDemande.Parent.Controls.Add(F)
F.Attributes("runat") = "server"
F.Controls.Add(GvDemande)
F.RenderControl(Htw)
'GvDemande.RenderControl(Htw)
Dim s As String = Sw.ToString()
s = TxtHtmlDebut & s & TxtHtmlFin
Response.Write(s)
Response.End()
End Sub