2009-08-07 19 views
2

したがって、ASP.Net(vb.net)アプリケーションがあります。それにはテキストボックスがあり、ユーザーはMicrosoft Wordのテキストをテキストボックスに貼り付けています。したがって、長いダッシュ(charcode 150)のようなものが入力として入力されます。他の例として、スマートな引用符やアクセント付きの文字があります。私のアプリケーションでは、私はそれらをxmlでエンコードし、SQLストアドプロシージャのxmlパラメータとしてデータベースに渡しています。ユーザーが入力したときと同じようにデータベースに挿入されます。文字サポートの問題 - 上位ASCII文字を下位ASCII文字に翻訳する方法

問題は、このデータを読み取るアプリケーションはこれらの文字が気に入らないことです。だから私はそれらを低いascii(私は思う)文字セットに変換する必要があります。それ、どうやったら出来るの?どのようにエンコードされているかをどのように判断するのですか?次のようなことができます。そして、ASCII相当のものをインテリジェントに翻訳することを要求するか、またはそのためのコードを書く必要がありますか?

また、Webページでこの問題を解決する方が簡単かもしれません。 Wordから文字の選択をコピーすると、いくつかの形式がクリップボードに表示されます。真っ直ぐなテキストが私が望むものです。ユーザーが貼り付けたときにHTMLテキストボックスにそのテキストが表示されるようにする方法はありますか?何とかWebページのエンコーディングを設定する必要がありますか?

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

これは長いダッシュを短くダッシュし、スマートな引用符を通常の引用符に使用するように見えます。私の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))) 

編集:あなたは非Unicode文字セットに変換する場合は、あなた過程でいくつかの文字を失うことになる1252

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

これらの入力文字の範囲はどのくらいでしょうか? 256? (各文字は1バイトに収まる)。そうだとすれば、256値のルックアップテーブルを実装するのは難しくありません。私は何年もBASICに興味を持っていませんでしたが、基本的には256バイトの配列をDIMに変換し、変換された値で配列を埋めます。つまり 'a'バイト目は 'a'になります。 150番目のバイトはハイフンになります。

1

である私の目的のために正しいターゲットエンコーディングを発見しました。データを読み込んでいるレガシーアプリケーションが文字列変換を行う必要がない場合は、UTF-7を使用して、ユニコードの世界に戻った後に変換することを検討してください。これはすべての特殊文字を保持します。