java中字符集什么意思

 我来答
jamxval
推荐于2017-09-10 · TA获得超过6821个赞
知道大有可为答主
回答量:4308
采纳率:82%
帮助的人:1415万
展开全部

Java 中字符串在内核中使用 Unicode,也就是说每个字符 JVM 只记录它的 Unicode Code Point,只有在网络传输或保存到磁盘上时才需要把它转换成特定的字符集的编码,这个字符集就是把一个 Unicode Code Point 整数翻译成一串 byte[],因为在网络或磁盘上,字节是一个一个排列的,我们需要知道把高位字节排前面还是排后面并且容易推断出哪个哪个字节是一个字符的边界,这样才能把相关的几个字节还原成一个字符而不是把第2个字符的后面半数字节和第3个字符的前面半数的字节拼在一起出一个怪异的字符,我们以前在早期的电脑游戏中不支持双字节汉语时我们经常碰到这个问题,那就是先输入一个汉字,在内存中有2个字节,然后我们按一下 backspace 软件只删除一个字节,我们再输入一个汉字之后一共有3个字节的,这时我们用一个支持汉字的软件来查看这个文字可能是第1个剩下的字节和后面的字符的第1字节拼起来刚好又是另一个汉字,而剩下的第3个字节就不是有意义的绘图符号。


当不需要把 JVM 内存中的字符传输到网络外或磁盘上或打印出来的时候,我们是不需要知道字符集的,在显示在图形界面上时JVM知道怎么把它们显示出来,现在的 Windows 操作系统同样也是 Unicode 内核的,也就是说我们只要说明 Unicode Code Point 它应该知道是什么字符,那么只剩下字体这边是否也是用 Unicode Code Point 来对应一个字符啦(这个我不确定,但估计也是),如果操作系统和字符这边也是按 Unicode Code Point 来对应,那么当我们不保存到磁盘或发送出网络时是完全不需要知道有字符集这回事的。


下面这个例子中处理一个 Unicode 6.0 新标准中收录的汉字,你看到 UTF-8, UTF-16, GB18030 支持它们,但 GB2312 没有收录这个汉字,所以出个问号,也就是我们学说的乱码啦。


什么是 Unicode,下面这样的表格就是 Unicode,而那些坐标数字就是 Code Point.


JDK 1.5 的 String 这个类支持 Unicode Code Point,也就是说能处理任何任意超出双字节的字符的处理,它是一些学术研究者(比如考古,古文献研究) 必须的功能,回想起来曾经的电报码翻译成电脑信息时由于输入法和字符集没有收录这些字没办法通过“输入一个数字得到这个字符的途径",大家都是先扫描一个用图片再在电脑中剪切出每个字符的小图片贴出来的。记得在汉字处理时如果碰到冷僻字时它会超出2个字节,用 charAt() 这个是会出错的,因为 char 类型表示范围在 0 - 255 之间(2个字节),不能直接保存冷僻字,需要用2个 char 来表示一个字,因此 substring 的位置全是错误的,我们需要 offsetByCodePoints 重新计算一次 index 才能正确地 substring。


public static void main(String[] args) throws IOException
{
int[] codePoints = new int[16];
for (int i = 0; i < 16; i++)
{
codePoints[i] = 0x20020 + i;
}

String a = new String(codePoints, 0, codePoints.length);

System.out.println("字符串:" + a);
System.out.println("字符串换算成 char[] 存储总长度是 :" + a.length());

System.out.println("codePointAt(7) 索引换算成 charAt 索引  :" + a.offsetByCodePoints(1, 7));

String c = a.substring(a.offsetByCodePoints(1, 7), a.offsetByCodePoints(1, 8));

System.out.println("UTF-8   for " + c + " is " + toString(c.getBytes("UTF-8")) + " ==> "
+ new String(c.getBytes("UTF-8"), "UTF-8"));

System.out.println("UTF-16  for " + c + " is " + toString(c.getBytes("UTF-16")) + " ==> "
+ new String(c.getBytes("UTF-16"), "UTF-16"));

System.out.println("GB2312  for " + c + " is " + toString(c.getBytes("GB2312")) + " ==> "
+ new String(c.getBytes("GB2312"), "GB2312"));

System.out.println("GB18030 for " + c + " is " + toString(c.getBytes("GB18030")) + " ==> "
+ new String(c.getBytes("GB18030"), "GB18030"));
}

private static String toString(byte[] input)
{
StringBuffer b = new StringBuffer();
b.append('[');
for (int i = 0, size = input.length; i < size; i++)
{
b.append(Integer.toString(input[i]));
if (i < size - 1)
b.append(',');
}
b.append(']');
return b.toString();
}


这个代码输出如下,为防止百度或者说你的电脑未安装支持冷僻字的字体,不能正确显示冷僻字,这里面用图片啦。

非鱼共享
2014-09-19 · 专注互联网技术,快速了解互联网研发
非鱼共享
采纳数:204 获赞数:695

向TA提问 私信TA
展开全部
计算机是美国人发明的,所以只认识英文,如果其它文字也需要让计算机认识,那必须自己创造一种编码格式,比如中文GBK编码,我们将一个汉字转换成两上ASCII码,而多世界上文字众多,所以就有很多种编码。这种编码格式就叫做字符集。希望能帮助到你,给个满意吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
3zzz3yyy3
2014-09-19 · 超过20用户采纳过TA的回答
知道答主
回答量:62
采纳率:0%
帮助的人:38.5万
展开全部
就是不同的区域(比如不同的国家有相应的字符集,如果字符集不匹配,可能乱码,所以要制定与这个国家匹配的字符集)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
brother__qiang
2014-09-19 · TA获得超过597个赞
知道小有建树答主
回答量:1346
采纳率:66%
帮助的人:528万
展开全部
就是指编码格式,比如utf-8,gb2312等
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式