特殊和重音字符

时间:2010-06-22 19:54:11

标签: java internationalization special-characters

我正在为法国客户做一些工作,因此需要处理重音字符。但是我遇到了很多困难,我希望解决方案很简单,有人可以向我指出。

字符串:La Forêt pour Témoin 转换为:La For? pour T?oin

请注意重音字符后面缺少的字符 - ê后面的 t é m >

我尝试使用StringEscapeUtils成功地转义某些字符,例如ă。我也建立了自己的转义功能,产生相同的结果(ă将起作用,ê不会)。

private String escapeChars(String string) {
    char[] chars = string.toCharArray();
    String result = "";
    for (int i = 0; i < chars.length; i++) {
        int c = chars[i];
        result += "&#" + c + ";";
    }
    return result;
} 

项目使用App Engine插件在eclipse中运行,我无法缩小问题是由Java,App Engine还是SQLite引起的。

感谢任何帮助。

编辑:我发现只是从表单中显示请求参数时字符串格式不正确。 (即,request.getParameter(“string”)已经有格式错误的内容。)

我尝试过丹尼尔建议的元标记但没有成功。我认为你是在正确的轨道上,html文件的标题数据如下:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

当重音字符被硬编码到JSP中时,它们会按预期显示。

编辑:我还在页面的最开头添加了<?xml version="1.0" encoding="UTF-8"?>

我非常接近解决方案。我发现如果我从浏览器中更改页面的编码,表单数据会正确传递给服务器。我无法弄清楚如何使浏览器自动检测页面编码。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

已解决:我无法弄清楚如何让浏览器自动检测java默认的UTF-8编码。所以我使用request.setCharacterEncoding(“ISO-8859-1”)强制字符编码为ISO-8859-1。

4 个答案:

答案 0 :(得分:6)

  

编辑:我发现只是从表单中显示请求参数时字符串格式不正确。 (即,request.getParameter(“string”)已经有格式错误的内容。)

这可能有三个原因:

  1. 这是一个GET请求,服务器未配置为使用UTF-8来解析请求URI。目前还不清楚你正在使用哪个服务器,所以这里有一个以Tomcat为目标的答案:将URIEncoding/conf/server.xml的{​​{1}}属性设置为UTF-8

  2. 如果是POST请求,则需要确保servletcontainer使用UTF-8对请求主体进行编码。您可以事先通过request.setCharacterEncoding("UTF-8")执行此操作。

  3. 您正在编写参数的控制台不支持UTF-8。目前还不清楚你在谈论哪个控制台,所以这里有一个以Eclipse为目标的答案作为例子:在 Window&gt;偏好&gt;一般&gt;工作区&gt;文本文件编码将其设置为UTF-8。

  4. 另见

答案 1 :(得分:1)

好的,第一个问题是你需要找出数据丢失的位置。

  • 添加unicode字符的相应记录(理想情况下为十六进制),以便您可以查看是否可以写入SQLite并正确检索数据。
  • 对一些数据进行硬编码,以便您可以看到它是否正确回归
  • 确保随时随地进行文字到二进制转换,指定适当的编码(例如UTF-8)

你还没有真正说哪里事情出错了,但我希望如果你整理出字符编码,其余部分就应该落实到位。 也许 SQLite有问题,但我对此表示怀疑......

答案 2 :(得分:1)

您需要确保发送回浏览器的HTML具有字符集。您应该将Content-Type: text/html; charset=UTF-8作为HTTP响应标头包含,作为head标记的第一个子元素发回:

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

或者,如果您使用的是XHTML:

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

虽然只拥有meta代码可以解决问题。

另外,请使用W3C Markup Validation Service确保您的HTML有效。

另请参阅:FAQ: Weird characters and question marks appear instead of accented characters

答案 3 :(得分:0)

字符串是否有可能,但您是否尝试使用en-us本地化打印这些字符?