所以我有一个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())
答案 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>