具有变音符号的字符被转换为ascii

时间:2014-04-11 08:06:26

标签: java java-ee character-encoding

我正在尝试从TextArea获取最多500个字符的值。但是我遇到了带有变音符号的字符的问题,其中每个特殊字符被4个字符替换。因此,如果我提供包含法语字符的500个字符的文本,则在数据库中持久存在的实际长度(字段长度为500)超过500个字符且事务失败。

一些例子:

  • oubliée转换为oubliée
  • désiriez转换为dé©siriez

如果我做错了或者如何获取用户在Java代码中输入的实际文本,有人可以纠正我吗? 我正在使用以下代码片段:

表单定义:

<form id="contForm" method="post" name="formCont"
    action="/wps/customforms/ParticipationRequest"
    enctype="multipart/form-data">

TextArea定义:

<div class="spec textarea small" id="inpSpec">
    <label class="label" for="inp"><%=content.getLangMap().get(langcode)%>
        <span class="required">*</span> <span class="hint"></span> </label>
    <div class="value">
        <div class="control">
            <textarea cols="5" rows="3"
                id="<%=String.valueOf(content.getId())%>"
                name="<%=String.valueOf(content.getId())%>"></textarea>
        </div>
    </div>
</div>

Servlet片段:

List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
String description = null;
for (FileItem item : items) {
        if (item.isFormField()) {
                if (item.getFieldName().equalsIgnoreCase(String.valueOf(content.getId()))) {

                        // Here I get invalid data for french characters.
                        description =  item.getString());
                    }
        }
}

其他信息:

  • 使用的应用程序服务器:WAS
  • 平台:Linux
  • 我尝试将请求的字符编码类型设置为UTF-8,iso-8951 ......但它似乎不起作用。

1 个答案:

答案 0 :(得分:0)

utf-8中127以上的所有字符都以两个或更多字节进行转义。您似乎在数据写入程序和数据写入程序之间存在编码不匹配:

  • 显示é的文字是典型的一些法语口音字符,保存为utf-8编码,但后来读作latin-1(又名iso-8859-1):é(hex {{ 1}})在latin-1中保存在utf-8中变为E9(= C3 A9如果显示为&#34;原始&#34;字符)
  • 但如果é依次保存为utf-8,则é显示为C3 83 C2 A9显示为原始字符或拉丁编码

我不知道您的应用程序服务器,但查看文本可写为utf-8的位置,但读作纯ISO-8859 /拉丁文本。