如何在JSP中将智能引号转换为纯文本

时间:2013-01-22 11:02:14

标签: jsp encoding character-encoding special-characters

我有一个场景,我从MS Word或Outlook复制数据并将其粘贴到JSP textarea中,然后尝试使用Spring和Hibernate将相同的数据预先存储到Oracle数据库中。问题是以下句子

这不是唯一的角色,我们也允许 - 而且 -

被替换为

它不是唯一的角色,我们也允许 和 - 也。

任何人都可以告诉我如何将实际数据保存到表中。

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

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

1 个答案:

答案 0 :(得分:0)

答案:按照下面提到的步骤解决了这个问题。

  1. 保留以下部分

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    
  2. 在JSP的head部分。已删除&lt;元标记之前的标记。

    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层的setter方法,使用上面提到的实用程序,如下所示。

      public String getIncidentShrtDescC() {
          return this.incidentShrtDescC;
      }
      
      public void setIncidentShrtDescC(String incidentShrtDescC) {
          this.incidentShrtDescC = AppGlobalUtil.windows1252ToIso8859(incidentShrtDescC);
      }
      
    4. 上述所有内容的组合有助于解决问题。希望这篇文章可以帮助一些流浪的灵魂面对同样的问题。

      快乐编码。