我们在DB中有一个clob列。现在,当我们提取这个clob并尝试显示它(纯文本而不是html)时,它会在html屏幕上打印一些字符。直接流式传输到文件时的字符看起来像”
(不是普通键盘上通常的双引号)
还有一个观察结果:
System.out.println("”".getBytes()[0]);
打印-108
。
为什么字符字节应该在负范围内?有没有办法在html屏幕上正确显示它?
答案 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字符。
要设置编码,您有两个选项。
Content-Type:
text/html; charset=UTF-8
。<meta charset="UTF-8" />
标记
页面的头部。请记住,选项1优先于选项2。如果您已经在标题中设置了错误的字符集,则无法使用元标记覆盖它。
另一个选项是实体化非ASCII字符。对于问题中的引号字符,您可以使用”
或”
或”
。第一个是用户友好的命名实体,第二个指定十进制字符的Unicode代码点,第三个指定十六进制的代码点。一切都有效,一切都会有效。
通常,如果您要从包含未知字符的数据库中实体化动态内容,您最好只使用实体的代码点版本,因为您可以轻松编写转换任何字符的方法&gt; 127到适当的代码点。
我目前正在处理的其中一个系统实际遇到了这个问题,我们从UTF-8源获取数据,并且必须提供无法控制Content-Type标头的HTML页面。实际上,我们最终编写了一个自定义的Java Charset,它可以将Java字符流转换为ASCII编码的字节流,并将所有非ASCII字符转换为实体。然后我们将输出流包装在具有该Charset的Writer中并像往常一样输出所有内容。正确实现Charset有一些问题,但只是自己编写代码非常简单,只需确保正确处理代理对。