日期:2014-05-20  浏览次数:20566 次

关于java中的代码点与代码单元

? String substring(int beginIndex)
? String substring(int beginIndex, int endIndex)
returns a new string consisting of all code units from beginIndex until the end of the
string or until endIndex - 1.

这两个函数返回开始索引到结束索引的代码单元,那如果一个代码点是由两个代码单元组成的,刚好被截断了,只返回了一个代码单元,那是什么结果呢?

------解决方案--------------------
想回答,但是有点不懂你的意思,截断什么意思??可以举个例子吗,这样比较好说明~~
------解决方案--------------------
那你就用两会 subString(a,b)呗,只要你知道开始索引和结束索引,两个单元分别用一次,两个就都返回了
------解决方案--------------------
那就出现了乱码。你要用codePointAt功能来判断截断点是否是两个代码单元组成的代码点
------解决方案--------------------
引用:
Quote: 引用:

那就出现了乱码。你要用codePointAt功能来判断截断点是否是两个代码单元组成的代码点


为什么substring不直接返回代码点呢? 如果字符串含有增补代码点的话,这样用的时候岂不是很麻烦,每次都要codePointAt(i);来确定?

其实根本的问题是Java没有用代码点二是代码单元来组织String。但是这个问题也是历史遗留问题,当年的UTF16规定一个代码点只能有两个代码单元,所以String就这么设计了。后来新加的补充代码才规定某些代码点需要4个代码单元,但是Java不能就这么改了因为
1) String太底层了
2) 要么导致效率低下,要么导致内存占用增加
3) 开发Java的人只需要26个字母
以上纯属猜测。不过你可以写一个subStringByCodePoint方法来做这件事情