我们在DB中有一个clob列。现在,当我们提取这个clob并尝试显示它(纯文本而不是html)时,它会在html屏幕上打印一些垃圾文字。当直接传输到一个文件中的字符看起来像”
(不是一般的双普通键盘上的引号)字符编码问题?
一个多观察:
System.out.println("”".getBytes()[0]);
打印-108
。
为什么一个字符字节应该在负的范围内?有什么方法可以在html屏幕上正确显示它吗?
我们在DB中有一个clob列。现在,当我们提取这个clob并尝试显示它(纯文本而不是html)时,它会在html屏幕上打印一些垃圾文字。当直接传输到一个文件中的字符看起来像”
(不是一般的双普通键盘上的引号)字符编码问题?
一个多观察:
System.out.println("”".getBytes()[0]);
打印-108
。
为什么一个字符字节应该在负的范围内?有什么方法可以在html屏幕上正确显示它吗?
回复:您的最后一点 - 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类 。
我认为,这将是更好的打印像这样的字符代码:
System.out.println((int)'”');//result is 8221
This link可以帮你解释这个非同寻常的双引号(包括HTML代码)。
要获得关于HTML文档中正确显示字符的问题,你需要做两件事情之一:要么设置文档的编码或实体IZE非ASCII字符。
要设置编码,您有两个选项。
Content-Type: text/html; charset=UTF-8
。<meta charset="UTF-8" />
标签添加到您的 页面的头部。请记住,选项1将优先选项2.即如果您已经在标题中设置了不正确的字符集,则无法用元标记覆盖它。
另一种选择是实体化非ASCII字符。对于您问题中的引号字符,您可以使用”
或”
或”
。第一个是用户友好的命名实体,第二个用十进制指定字符的Unicode代码点,第三个用十六进制指定代码点。所有的都是有效的,所有的都可以。
通常,如果您要从包含未知字符的数据库中实体化动态内容,最好使用实体的代码点版本,因为您可以轻松编写一种方法将任何字符> 127到适当的代码点。
我目前正在处理的一个系统实际上遇到了这个问题,我们从UTF-8源获取数据并且不得不提供HTML页面而无法控制Content-Type标题。实际上,我们最终编写了一个自定义Java Charset,它可以将Java字符流转换为ASCII编码字节流,并将所有非ASCII字符转换为实体。然后我们用一个Charset将输出流封装在Writer中,并像往常一样输出所有内容。在正确实现一个Charset的时候有几个问题,但是简单地做自己的编码非常简单,只要确保正确处理代理对。
它在您的平台上的特定默认编码(推测为UTF-8)中长3个字节。 – 2012-07-06 14:09:16
是的,好点!将添加一个明确的编码,使清晰... – DNA 2012-07-06 14:11:29