"<pre class=""brush:java; toolbar: true; auto-links: false;"">public AbstractStringBuilder reverse() { boolean hasSurrogate = false; int n = count - 1; for (int j = (n-1) >> 1; j >= 0; --j) { char temp = value[j]; char temp2 = value[n - j]; if (!hasSurrogate) { hasSurrogate = (temp >= Character.MIN_SURROGATE && temp <= Character.MAX_SURROGATE) || (temp2 >= Character.MIN_SURROGATE && temp2 <= Character.MAX_SURROGATE); } value[j] = temp2; value[n - j] = temp; } if (hasSurrogate) { // Reverse back all valid surrogate pairs for (int i = 0; i < count - 1; i++) { char c2 = value[i]; if (Character.isLowSurrogate(c2)) { char c1 = value[i + 1]; if (Character.isHighSurrogate(c1)) { value[i++] = c1; value[i] = c2; } } } } return this; }
上面是reverse的源码,其中hasSurrogate表示unicode编码占用一个还是两个字符。
现在想实现:构造一个StringBuilder对象,调用其reverse方法,进行调试,使其满足hasSurrogate 为true
的情况。
尝试使用中文字符,但是无效,比如:os我china,调试时hasSurrogate仍然为false。
求大家指点。
""
用 "os"+(char)57343+"china" 试下
######恩,这个可以,只不过(char)57343会显示为?。达到我的目的了。######神马情况?我木有描述清楚吗?######代理项对的第一个值是高代理项,包含介于 U+D800 到 U+DBFF 范围内的 16 位代码值。该对的第二个值是低代理项,包含介于 U+DC00 到 U+DFFF 范围内的值。
你找到“os我china”中我的16位unicode码,输入看看
######GOOGLE 搜索hasSurrogate
我在第二页瞄到了 几个关键的字 (看源码时hasSurrogate这个玩意不是很清楚查了下资料豁然开朗)
2009年4月7日 – public AbstractStringBuilder reverse() { boolean hasSurrogate = false; int n ... 看源码时hasSurrogate这个玩意不是很清楚查了下资料豁然开朗 ...
JDK 1.5 对超大字符集的支持
作者: 本站会员 来源: 发布时间:2009-04-07 20:46:12
JDK 1.5 对超大字符集的支持
Unicode 与超大字符集
国标 GB18030 规定了4字节扩展部分,这部分区域目前在 Unicode 规范中作为CJK Ext B区存在,即常说的中文超大字符集。这部分区域编码为 \U20000 - \U2A6D6。
UTF-16与Java String/Character 对象
一个完整的 Unicode 字符叫 代码点/CodePoint,而一个 Java char 叫 代码单元 code unit。
String 对象以UTF-16保存 Unicode 字符,需要用2个字符表示一个 超大字符集的汉字,这这种表示方式称之为 Surrogate,第一个字符叫 Surrogate High,第二个就是 Surrogate Low。
判断一个char是否是 Surrogate 区的字符,用 Character的 isHighSurrogate()/isLowSurrogate()方法。
从两个Surrogate High/Low 字符,返回一个完整的 Unicode CodePoint 用 Character.toCodePoint()/codePointAt()方法。
一个 Code Point ,可能需要一个也可能需要两个char表示,因此不能直接使用 CharSequence.length()方法直接返回一个字符串到底有多少个汉字,而需要用String.codePointCount()/Character.codePointCount()。
要定位字符串中的第N个字符,不能直接将 N 作为偏移量,而需要从字符串头部依次遍历得到,需要用String/Character.offsetByCodePoints() 方法。
从字符串的当前字符,找到上一个字符,也不能直接用offset -- 实现,而需要用 String.codePointBefore()/Character.codePointBefore(),或用 String/Character.offsetByCodePoints()
从当前字符,找下一个字符,不能直接用 offset ++ 实现,需要判断当前 CodePoint 的长度后,再计算得到,或用 String/Character.offsetByCodePoints() 。
Swing 对 超大字符集的支持
JTextPane增加了对 超大字符集的支持,只要设置字体正确,就可以显示和编辑超大字符集。
搜索能力能体现很多问题
######GOOGLE 搜索hasSurrogate
我在第二页瞄到了 几个关键的字 (看源码时hasSurrogate这个玩意不是很清楚查了下资料豁然开朗)
2009年4月7日 – public AbstractStringBuilder reverse() { boolean hasSurrogate = false; int n ... 看源码时hasSurrogate这个玩意不是很清楚查了下资料豁然开朗 ...
JDK 1.5 对超大字符集的支持
作者: 本站会员 来源: 发布时间:2009-04-07 20:46:12
JDK 1.5 对超大字符集的支持
Unicode 与超大字符集
国标 GB18030 规定了4字节扩展部分,这部分区域目前在 Unicode 规范中作为CJK Ext B区存在,即常说的中文超大字符集。这部分区域编码为 \U20000 - \U2A6D6。
UTF-16与Java String/Character 对象
一个完整的 Unicode 字符叫 代码点/CodePoint,而一个 Java char 叫 代码单元 code unit。
String 对象以UTF-16保存 Unicode 字符,需要用2个字符表示一个 超大字符集的汉字,这这种表示方式称之为 Surrogate,第一个字符叫 Surrogate High,第二个就是 Surrogate Low。
判断一个char是否是 Surrogate 区的字符,用 Character的 isHighSurrogate()/isLowSurrogate()方法。
从两个Surrogate High/Low 字符,返回一个完整的 Unicode CodePoint 用 Character.toCodePoint()/codePointAt()方法。
一个 Code Point ,可能需要一个也可能需要两个char表示,因此不能直接使用 CharSequence.length()方法直接返回一个字符串到底有多少个汉字,而需要用String.codePointCount()/Character.codePointCount()。
要定位字符串中的第N个字符,不能直接将 N 作为偏移量,而需要从字符串头部依次遍历得到,需要用String/Character.offsetByCodePoints() 方法。
从字符串的当前字符,找到上一个字符,也不能直接用offset -- 实现,而需要用 String.codePointBefore()/Character.codePointBefore(),或用 String/Character.offsetByCodePoints()
从当前字符,找下一个字符,不能直接用 offset ++ 实现,需要判断当前 CodePoint 的长度后,再计算得到,或用 String/Character.offsetByCodePoints() 。
Swing 对 超大字符集的支持
JTextPane增加了对 超大字符集的支持,只要设置字体正确,就可以显示和编辑超大字符集。
搜索能力能体现很多问题
可能是我没有表述清楚,这些内容我已经看过。现在我想达到的目的:构造一个StringBuilder,调用其reverse方法,进行调试,验证hasSurrogate为true的场景。
还是很感谢,造成误解了。哈哈。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。