Проблема с поддержкой символов - Как преобразовать более высокие символы ASCII в более низкие символы ASCII - PullRequest
2 голосов
/ 07 августа 2009

Итак, у меня есть приложение ASP.Net (vb.net). У него есть текстовое поле, и пользователь вставляет в него текст из Microsoft Word. Таким образом, такие вещи, как длинная черта (код 150) вводятся в качестве входных данных. Другими примерами будут умные цитаты или акцентированные символы. В моем приложении я кодирую их в xml и передаю в базу данных как параметр xml в хранимую процедуру sql. Он вставляется в базу данных так же, как пользователь ввел ее.

Проблема в том, что приложение, которое читает эти данные, не любит эти символы. Поэтому мне нужно перевести их в нижний набор символов ascii (я думаю, 7 бит). Как я могу это сделать? Как определить, в какой кодировке они находятся, чтобы я мог сделать что-то вроде следующего. И просто запросить эквивалент 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 ]

1 голос
/ 07 августа 2009

Похоже, это работает для длинных черт, коротких черт и умных кавычек к обычным Как мои HTML-страницы имеет следующий тип контента. Но он преобразует все акцентированные символы в знаки вопроса. Что не то, что текстовая версия буфера обмена. Так что я ближе, я просто думаю, что у меня неправильная кодировка цели.

<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)))
1 голос
/ 07 августа 2009

Если вы преобразуете в набор символов, отличный от Юникода, вы потеряете некоторые символы в процессе. Если старое приложение, считывающее данные, не нуждается в каких-либо преобразованиях строк, вы можете рассмотреть возможность использования UTF-7 и преобразования его обратно, как только оно вернется в мир юникода - это сохранит все специальные символы.

1 голос
/ 07 августа 2009

Насколько велик диапазон этих входных символов? 256? (каждый символ помещается в один байт). Если это так, реализовать таблицу поиска с 256 значениями не составит труда. Я не играл с BASIC годами, но в основном вы бы DIM массив 256 байтов и заполнить массив переведенными значениями, то есть "а" байт получит "а" (так как это нормально, как есть), но 150-й байт получит дефис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...