字符支持问题 - 如何将较高的ASCII字符转换为较低的ASCII字符

时间:2009-08-07 14:27:09

标签: asp.net sql xml vb.net encoding

所以我有一个ASP.Net(vb.net)应用程序。它有一个文本框,用户将文本从Microsoft Word粘贴到其中。所以像长划线(charcode 150)这样的东西正在作为输入。其他例子是智能引号或重音字符。在我的应用程序中,我将它们编码为xml并将其作为xml参数传递给数据库到sql存储过程。它就像用户输入数据库一样插入到数据库中。

问题是读取此数据的应用程序不喜欢这些字符。所以我需要将它们转换为较低的ascii(我认为是7bit)字符集。我怎么做?如何确定它们的编码方式,以便我可以执行以下操作。只是请求ASCII等价物智能地翻译它们还是我必须为此编写一些代码?

也许可能更容易在网页中解决此问题。从Word复制字符选择时,它会在剪贴板中放置几种格式。直文一是我想要的。有没有办法让html文本框在用户粘贴时获取该文本?我是否必须以某种方式设置网页的编码?

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

将输入编码为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())

3 个答案:

答案 0 :(得分:1)

这些输入字符的范围有多大? 256? (每个字符都适合单个字节)。如果这是真的,那么实现256值查找表并不困难。多年来我没有玩BASIC,但基本上你是DIM一个256字节的数组并用转换后的值填充数组,即'a'字节会得到'a'(因为它没问题)但是第150个字节会得到一个连字符。

答案 1 :(得分:1)

这似乎适用于长短划线短划线和智能报价到常规报价。由于我的html页面具有以下内容类型。但它将所有重音字符转换为问号。这不是剪贴板的Text版本所具有的。所以我离我更近了,我只是觉得我的目标编码错了。

<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)))

编辑:为我的目的找到正确的目标编码,即1252。

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

答案 2 :(得分:1)

如果转换为非unicode字符集,在此过程中丢失一些字符。如果读取数据的遗留应用程序不需要进行任何字符串转换,您可能需要考虑使用UTF-7,并在它返回到unicode世界后将其转换回来 - 这将保留所有特殊字符。 / p>