StringBuilder中reverse的疑问:报错-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

StringBuilder中reverse的疑问:报错

kun坤 2020-06-05 23:23:46 17

"<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。

求大家指点。

"
Java
分享到
取消 提交回答
全部回答(1)
  • kun坤
    2020-06-05 23:23:58

    "

    用 "os"+(char)57343+"china" 试下

    ######恩,这个可以,只不过(char)57343会显示为?。达到我的目的了。######神马情况?我木有描述清楚吗?######

    代理项对的第一个值是高代理项,包含介于 U+D800 到 U+DBFF 范围内的 16 位代码值。该对的第二个值是低代理项,包含介于 U+DC00 到 U+DFFF 范围内的值。

    你找到“os我china”中我的16位unicode码,输入看看

    ######

    GOOGLE 搜索hasSurrogate

    我在第二页瞄到了 几个关键的字 (看源码时hasSurrogate这个玩意不是很清楚查了下资料豁然开朗)

    字符串反转函数与超大字符集编程语言

    www.建网站.com/编程语言/1-3434677.html

    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增加了对 超大字符集的支持,只要设置字体正确,就可以显示和编辑超大字符集。

     

     

     

    搜索能力能体现很多问题

    ######

    引用来自“dd”的答案

    GOOGLE 搜索hasSurrogate

    我在第二页瞄到了 几个关键的字 (看源码时hasSurrogate这个玩意不是很清楚查了下资料豁然开朗)

    字符串反转函数与超大字符集编程语言

    www.建网站.com/编程语言/1-3434677.html

    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的场景。

    还是很感谢,造成误解了。哈哈。

    ######中文字符不在U+D800 到 U+DBFF范围内,我使用:“os\uD801china”验证了,不过也是\uD801会显示? 谢谢啦。######Unicode 与超大字符集 国标 GB18030 规定了4字节扩展部分,这部分区域目前在 Unicode 规范中作为CJK Ext B区存在,即常说的中文超大字符集。这部分区域编码为 \U20000 - \U2A6D6。 用在这之内的试喽?"
    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题