0

我有一个场景,我从 MS Word 或 Outlook 复制数据并将其粘贴到 JSP 文本区域中,然后尝试使用 Spring 和 Hibernate 将其保存到 Oracle 数据库中。问题是下面这句话

它不是唯一的角色,我们也允许 - 并且 - 也

被替换为

它不是唯一的字符,我们也允许 �� 和 -- 也。

谁能告诉我如何将实际数据保存到表中。

注意:如果我在 textarea 中输入 ' 和 - 并坚持,它们会毫无问题地保存。仅当我从 word/outlook 复制文本并将它们粘贴到文本区域时才会出现问题。

我试图将以下内容放入我的 JSP 中,但无论如何都对我没有帮助。

4

1 回答 1

0

答:按照下面提到的步骤解决了同样的问题。

  1. 保留以下部分

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

在 JSP 的头部。已删除元标记之前的 < 标记。

  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 回答