2009-08-07 8 views
2

J'ai donc une application ASP.Net (vb.net). Il a une zone de texte et l'utilisateur y colle du texte de Microsoft Word. Donc, des choses comme le long tiret (charcode 150) arrivent en entrée. D'autres exemples seraient les citations intelligentes ou les caractères accentués. Dans mon application, je suis en train de les encoder en XML et de les transmettre à la base de données en tant que paramètre xml à une procédure stockée sql. Il est inséré dans la base de données au moment où l'utilisateur l'a saisi.Problème de support de caractères - Comment traduire des caractères ASCII plus élevés en caractères ASCII inférieurs

Le problème est que l'application qui lit ces données n'aime pas ces caractères. J'ai donc besoin de les traduire dans le jeu de caractères ascii inférieur (7bit je pense). Comment je fais ça? Comment puis-je déterminer quel encodage ils sont afin que je puisse faire quelque chose comme ce qui suit. Et demander simplement l'équivalent ASCII les traduire intelligemment ou dois-je écrire du code pour cela?

Aussi peut-être qu'il pourrait être plus facile de résoudre ce problème dans la page Web pour commencer. Lorsque vous copiez la sélection de caractères à partir de Word, il met plusieurs formats dans le Presse-papiers. Le texte droit est celui que je veux. Existe-t-il un moyen de faire en sorte que la zone de texte html reçoive ce texte lorsque l'utilisateur le colle? Dois-je définir l'encodage de la page Web d'une manière ou d'une autre?

System.Text.Encoding.ASCII.GetString(System.Text.Encoding.GetEncoding(1251).GetBytes(text)) 

code de l'application qui code l'entrée en xml:

Protected Function RequestStringItem(_ 
     ByVal strName As System.String) As System.String 

     Dim strValue As System.String 

     strValue = Me.Request.Item(strName) 
     If Not (strValue Is Nothing) Then 
     RequestStringItem = strValue.Trim() 
     Else 
     RequestStringItem = "" 
     End If 

    End Function 

    ' I get the input from the textboxes into an array like this 
    m_arrInsertDesc(intIndex) = RequestStringItem("txtInsertDesc" & strValue) 
    m_arrInsertFolder(intIndex) = RequestInt32Item("cboInsertFolder" & strValue) 

    ' create xml file for inserts 
    strmInsertList = New System.IO.MemoryStream() 
    wrtInsertList = New System.Xml.XmlTextWriter(strmInsertList, System.Text.Encoding.Unicode) 

    ' start document and add root element 
    wrtInsertList.WriteStartDocument() 
    wrtInsertList.WriteStartElement("Root") 

    ' cycle through inserts 
    For intIndex = 0 To m_intInsertCount - 1 

    ' if there is an insert description 
    If m_arrInsertDesc(intIndex).Length > 0 Then 

     ' if the insert description is of the appropriate length 
     If m_arrInsertDesc(intIndex).Length <= 96 Then 

      ' add element to xml 
      wrtInsertList.WriteStartElement("Insert") 
      wrtInsertList.WriteAttributeString("insertdesc", m_arrInsertDesc(intIndex)) 
      wrtInsertList.WriteAttributeString("insertfolder", m_arrInsertFolder(intIndex).ToString()) 
      wrtInsertList.WriteEndElement() 

     ' if insert description is too long 
     Else 

      m_strError = "ERROR: INSERT DESCRIPTION TOO LONG" 
      Exit Function 

     End If 

    End If 

    Next 

    ' close root element and document 
    wrtInsertList.WriteEndElement() 
    wrtInsertList.WriteEndDocument() 
    wrtInsertList.Close() 

    ' when I add the xml as a parameter to the stored procedure I do this 
    cmdAddRequest.Parameters.Add("@insert_list", OdbcType.NText).Value = System.Text.Encoding.Unicode.GetString(strmInsertList.ToArray()) 
+0

C'est ce que je saisis. Ceci est un peu de texte avec des caractères "amusants" comme: áíóúñѺª¿⌐¬ÇüéâäàåçêëèïîìÄÅææÆôöòûùÿÖÜ ¢ £ ¥ ₧ ƒá C'est ce que je veux en sortie. Ceci est du texte avec des caractères "amusants" comme: áíóúñѺª¿? ÇüéâäàåçêëèïîìÄÅææÆôöòûùÿÖÜ ¢ £ ¥? Ƒá –

Répondre

1

Cela semble fonctionner pour un tiret long à court tiret et des citations intelligentes à des citations régulières. Comme mes pages html a ce qui suit comme type de contenu. Mais il convertit tous les caractères accentués en points d'interrogation. Ce qui n'est pas ce que la version Text du presse-papiers a. Donc, je suis plus proche, je pense juste que j'ai l'encodage de la cible mal.

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 

System.Text.Encoding.ASCII.GetString(System.Text.Encoding.GetEncoding("iso-8859-1").GetBytes(m_arrFolderDesc(intIndex))) 

Edit: Trouvé le codage cible correct pour mes fins qui est 1252.

System.Text.Encoding.GetEncoding(1252).GetString(System.Text.Encoding.GetEncoding("iso-8859-1").GetBytes(m_arrFolderDesc(intIndex))) 
1

Quelle est la portée de ces caractères d'entrée? 256? (Chaque caractère correspond à un seul octet). Si c'est vrai, il ne serait pas difficile d'implémenter une table de recherche de 256 valeurs. Je n'ai pas joué avec BASIC depuis des années, mais fondamentalement, vous DIM un tableau de 256 octets et remplissez le tableau avec des valeurs traduites, c'est-à-dire que le 'a'th byte obtiendrait' a '(puisque c'est OK) le 150ème octet recevrait un trait d'union.

1

Si vous convertissez à un jeu de caractères non-unicode, vous vous perdre certains caractères dans le processus. Si l'application héritée lisant les données n'a pas besoin d'effectuer de transformations de chaînes, vous pouvez envisager d'utiliser UTF-7 et de les convertir une fois de retour dans le monde Unicode, afin de conserver tous les caractères spéciaux.

Questions connexes