0

MS Word または Outlook からデータをコピーして JSP テキストエリアに貼り付け、Spring と Hibernate を使用して同じデータを Oracle データベースに保存しようとするシナリオがあります。問題は次の文です

それは唯一のキャラクターではありません。

に置き換えられます

それは唯一の文字ではなく、私たちはまた、 と -- も許可します。

実際のデータをテーブルに永続化する方法を教えてください。

注: ' と - をテキストエリアに入力して永続化すると、問題なく保存されます。word/outlook からテキストをコピーしてテキスト領域に貼り付けた場合にのみ問題が発生します。

私は自分の JSP に以下を入れようとしましたが、とにかく役に立ちません。

4

1 に答える 1

0

回答: 以下の手順に従って同じ問題を解決しました。

  1. 次のセクションを保持

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    

JSP の head セクション。メタ タグの前の < タグを削除しました。

  1. Web.xml に UTF-8 エンフォーサーを追加しました。次のコードが使用されました。

    <filter>
    
        <filter-name>encodingFilter/filter-name>
    
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter/filter-class>
    
        <init-param>
    
            <param-name>encoding/param-name>
    
            <param-value>UTF-8/param-value>
    
        </init-param>
    
        <init-param>
    
            <param-name>forceEncoding/param-name>
    
            <param-value>true/param-value>
    
        </init-param>
    
    </filter>
    
    <filter-mapping>
    
        <filter-name>encodingFilter/filter-name>
    
        <url-pattern>/*/url-pattern>
    
    </filter-mapping>
    
  2. ユーティリティを使用して、スマート クォートをプレーン テキストに変換します。私が使用したユーティリティを以下に示します ( http://forum.springsource.org/showthread.php?72944-How-to-handle-Smart-Quotes-pasted-into-TextArea-inputから参照)。ソリューションのその部分を投稿してくれた RobertGloverJr に感謝します。

    public static void windows1252ToIso8859(StringBuilder sbOriginal)  {
          if (null==sbOriginal) {
             return;
          }
          for (int isb = 0; isb < sbOriginal.length(); isb++)  {
             int origCharAsInt = (int) sbOriginal.charAt(isb);
             switch (origCharAsInt) {
    
             case ((int)'\u2018'):  sbOriginal.setCharAt(isb, '\''); break;  // left single quote
             case ((int)'\u2019'):  sbOriginal.setCharAt(isb, '\''); break;  // right single quote
             case ((int)'\u201A'):  sbOriginal.setCharAt(isb, '\''); break;  // lower quotation mark
    
             case ((int)'\u201C'):  sbOriginal.setCharAt(isb, '"'); break;  // left double quote
             case ((int)'\u201D'):  sbOriginal.setCharAt(isb, '"'); break;  // right double quote
             case ((int)'\u201E'):  sbOriginal.setCharAt(isb, '"'); break;  // double low quotation mark
    
             case ((int)'\u2039'):  sbOriginal.setCharAt(isb, '\''); break;  // Single Left-Pointing Quotation Mark
             case ((int)'\u203A'):  sbOriginal.setCharAt(isb, '\''); break;  // Single right-Pointing Quotation Mark
    
             case ((int)'\u02DC'):  sbOriginal.setCharAt(isb, '~'); break;  // Small Tilde
    
             case ((int)'\u2013'):  sbOriginal.setCharAt(isb, '-'); break;  // En Dash
             case ((int)'\u2014'):  sbOriginal.setCharAt(isb, '-'); break;  // EM Dash
    
             default: break;
             }
          }
       }
    
       public static String windows1252ToIso8859(String strOriginal)  {
          if (null==strOriginal) {
             return null;
          }
          StringBuilder sbOrig = new StringBuilder(strOriginal);
          windows1252ToIso8859(sbOrig);
          return sbOrig.toString();
       }
    
  3. 最後に、以下に示すように、DAO レイヤーのセッター メソッドを上記のユーティリティを使用するように変更しました。

    public String getIncidentShrtDescC() {
        return this.incidentShrtDescC;
    }
    
    public void setIncidentShrtDescC(String incidentShrtDescC) {
        this.incidentShrtDescC = AppGlobalUtil.windows1252ToIso8859(incidentShrtDescC);
    }
    

上記のすべてを組み合わせることで、問題の解決に役立ちました。この投稿が、同じ問題に直面しているさまよう魂の助けになることを願っています.

ハッピーコーディング。

于 2013-01-22T11:56:44.173 に答える