特殊和重音字符

3
我正在为一位法国客户工作,需要处理带重音符号的字符。但我遇到了很多困难,希望解决方案很简单,希望有人能指出给我。
字符串: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")已经具有格式不正确的内容)。
我已经尝试了Daniel建议的meta标签,但没有成功。 不过我认为你正走在正确的轨道上,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"?>
<!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" />

已解决:我无法弄清楚如何使浏览器自动检测 UTF-8 编码,而 Java 默认使用此编码。因此,我强制将字符编码设置为 ISO-8859-1,使用 request.setCharacterEncoding("ISO-8859-1")。


1
虽然这篇文章不能解决问题,但是它值得一读:http://www.joelonsoftware.com/articles/Unicode.html - Dave Jarvis
如果表单提交后的请求参数不正确,那么浏览器肯定是在尝试使用无法表示带重音字符的自动检测字符集。请尝试在文档的开头添加以下内容:<?xml version="1.0" encoding="UTF-8"?>,注意不要在前面加任何空格;这些必须是 XHTML 文档中的第一个字符。 - Daniel Trebbien
4个回答

6

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

这可能有三个原因:

  1. 这是一个GET请求,服务器未配置使用UTF-8解析请求URI。不清楚您使用的是哪个服务器,以下以Tomcat为例:在/conf/server.xml中设置HTTP ConnectorURIEncoding属性为UTF-8

  2. 如果是POST请求,则需要确保servlet容器使用UTF-8编码请求正文。您可以事先使用request.setCharacterEncoding("UTF-8")来实现。

  3. 您将参数写入的控制台不支持UTF-8。不清楚您所说的控制台是哪个,以下以Eclipse为例:在Window > Preferences > General > Workspace > Text File Encoding中将其设置为UTF-8。

另请参阅:


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 标记验证服务 验证您的 HTML 是否有效。

另请参见:FAQ:出现重音字符和问号而非重音字符


我尝试了一下元标签,但问题仍未解决。我会查看你提供的参考资料。 - klonq

1

好的,首先问题是您需要找出数据丢失的位置。

  • 添加适当的日志记录 Unicode 字符(最好使用十六进制),这样你就可以看到是否能够正确地写入 SQLite 并检索数据。
  • 硬编码一些数据,以便您可以查看其是否正确返回
  • 确保在任何文本转二进制的地方,您都指定了适当的编码(例如 UTF-8)

您并没有真正说出错误所在,但我预计如果您解决了字符编码问题,其他问题应该会迎刃而解。也许 SQLite 有问题,但我怀疑...


我认为我已经将问题缩小到客户端生成的请求头。请参见上面的编辑。 - klonq

0

字符串是否完好无损,但您正在尝试使用 en-us 本地化打印这些字符?


HTTP响应头是否包含在“Content-Language”字段中设置的有效语言集合完全没有任何影响。问题在于HTML文件的字符集与服务器解密文件并告诉客户端解密文件的字符集不同。在这种情况下,本地化没有任何区别。 - ThePyroEagle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接