2012-07-06 93 views
2

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

一个多观察:

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

打印-108

为什么一个字符字节应该在负的范围内?有什么方法可以在html屏幕上正确显示它吗?

回答

2

回复:您的最后一点 - Java的字节总是签署。为了将其解释为无符号,你可以用一个int位与他们:

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()]的当此字符串不能 在给定的charset编码的行为是未指定的。当需要对编码过程进行更多控制时,应使用CharsetEncoder类 。

+0

它在您的平台上的特定默认编码(推测为UTF-8)中长3个字节。 – 2012-07-06 14:09:16

+0

是的,好点!将添加一个明确的编码,使清晰... – DNA 2012-07-06 14:11:29

2

我认为,这将是更好的打印像这样的字符代码:

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

This link可以帮你解释这个非同寻常的双引号(包括HTML代码)。

0

要获得关于HTML文档中正确显示字符的问题,你需要做两件事情之一:要么设置文档的编码或实体IZE非ASCII字符。

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

  1. 更新您的Web服务器在 的Content-Type头发送适当的字符集参数。正确的标题将是Content-Type: text/html; charset=UTF-8
  2. 一个<meta charset="UTF-8" />标签添加到您的 页面的头部。

请记住,选项1将优先选项2.即如果您已经在标题中设置了不正确的字符集,则无法用元标记覆盖它。

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

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

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