字符编码问题?

时间:2012-07-06 13:55:48

标签: java character-encoding

我们在DB中有一个clob列。现在,当我们提取这个clob并尝试显示它(纯文本而不是html)时,它会在html屏幕上打印一些字符。直接流式传输到文件时的字符看起来像(不是普通键盘上通常的双引号)

还有一个观察结果:

System.out.println("”".getBytes()[0]);

打印-108

为什么字符字节应该在负范围内?有没有办法在html屏幕上正确显示它?

3 个答案:

答案 0 :(得分:2)

Re:你最后的观察 - Java字节总是被签名。要将它们解释为无符号,可以使用int:

对它们进行按位AND运算
byte[] bytes = "”".getBytes("UTF-8");
for(byte b: bytes)
{
    System.out.println(b & 0xFF);
}

输出:

226 
128
157

请注意,您的字符串实际上是UTF-8中的三个字节长。

正如评论中所指出的,它取决于编码。对于UTF-16,你得到:

254
255
32
29

,对于US-ASCII或ISO-8859-1,你得到

63

这是一个问号(即“我不知道,一些新奇的角色”)。 Note that

  

当此字符串不能时,此方法[getBytes()]的行为   在给定的字符集中编码是未指定的。 CharsetEncoder类   在对编码过程进行更多控制时应该使用   必需的。

答案 1 :(得分:2)

我认为以这种方式打印字符代码会更好:

System.out.println((int)'”');//result is 8221

This link可以帮助您解释这个非凡的双引号(包括HTML代码)。

答案 2 :(得分:0)

要回答有关在HTML文档中正确显示字符的问题,您需要执行以下两项操作之一:设置文档的编码或实体化非ascii字符。

要设置编码,您有两个选项。

  1. 更新您的Web服务器以发送适当的charset参数 Content-Type标头。正确的标题是Content-Type: text/html; charset=UTF-8
  2. 添加<meta charset="UTF-8" />标记 页面的头部。
  3. 请记住,选项1优先于选项2。如果您已经在标题中设置了错误的字符集,则无法使用元标记覆盖它。

    另一个选项是实体化非ASCII字符。对于问题中的引号字符,您可以使用&rdquo;&#8221;&#x201D;。第一个是用户友好的命名实体,第二个指定十进制字符的Unicode代码点,第三个指定十六进制的代码点。一切都有效,一切都会有效。

    通常,如果您要从包含未知字符的数据库中实体化动态内容,您最好只使用实体的代码点版本,因为您可以轻松编写转换任何字符的方法&gt; 127到适当的代码点。

    我目前正在处理的其中一个系统实际遇到了这个问题,我们从UTF-8源获取数据,并且必须提供无法控制Content-Type标头的HTML页面。实际上,我们最终编写了一个自定义的Java Charset,它可以将Java字符流转换为ASCII编码的字节流,并将所有非ASCII字符转换为实体。然后我们将输出流包装在具有该Charset的Writer中并像往常一样输出所有内容。正确实现Charset有一些问题,但只是自己编写代码非常简单,只需确保正确处理代理对。