我有一个场景,我从MS Word或Outlook复制数据并将其粘贴到JSP textarea中,然后尝试使用Spring和Hibernate将相同的数据预先存储到Oracle数据库中。问题是以下句子
这不是唯一的角色,我们也允许 - 而且 -
被替换为
它不是唯一的角色,我们也允许 和 - 也。
任何人都可以告诉我如何将实际数据保存到表中。
注意:如果我输入'和 - 进入textarea并坚持下去,它们会毫无问题地保存。只有当我从word / outlook复制文本并将其粘贴到文本区域时才会出现问题。
我试图将以下内容放入我的JSP中,但无论如何都无法帮助我。
答案 0 :(得分:0)
答案:按照下面提到的步骤解决了这个问题。
保留以下部分
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
在JSP的head部分。已删除&lt;元标记之前的标记。
在我的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>
使用实用程序将智能引号转换为纯文本。我使用的实用程序如下所述(参考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();
}
最后改变了我的DAO层的setter方法,使用上面提到的实用程序,如下所示。
public String getIncidentShrtDescC() {
return this.incidentShrtDescC;
}
public void setIncidentShrtDescC(String incidentShrtDescC) {
this.incidentShrtDescC = AppGlobalUtil.windows1252ToIso8859(incidentShrtDescC);
}
上述所有内容的组合有助于解决问题。希望这篇文章可以帮助一些流浪的灵魂面对同样的问题。
快乐编码。