让我先考考你。你说这一串(ab-2?3?4)有多少个字符?
这时你可以开始数数,123 …是的,我们确实用肉眼看到了9。java代码如下所示:
有没有发现java判断的不是9,而是12!!!
那是因为这个字符串里有2个字符ab-2?3?事实上,UTF 8号不能满足它。见下图:
Java的字符串用UTF-16表示,U+0000-U+FFFFF都可以,但是只要后面区间的字符不能用常规手段处理,就不能用长度正确判断5位内码的长度。
中日韩统一表意文字扩展B (U+20000到U+2A6DD)中日韩统一表意文字扩展C (U+2A700到U+2B734)中日韩统一表意文字扩展D (U+2B740到U+2B81D)中日韩统一表意文字扩展E (U+2B820到U+2CEA1)中日韩统一表意文字扩展F (U+2CEB0到U+2EBE0)
具体来说,你也可以查看官方数据,了解unicode、UTF-8、UTF-16和UTF-32之间的区别。
如下图,字符数可以通过character中的codePointCount得到。
进入主题
Jdk自己的角色类特别好用。汉字转换为内码的具体功能请参考以下代码。
/* * *字符串转换为十六进制代码* @param str ab-2?3?4 * @ return \ \ u61 \ \ u62 \ \ u4e 00 \ \ u32 \ \ u2b 802 \ \ u4eef \ \ u33 \ \ u2b 82f \ \ u34 \ \ u34 */公共静态字符串stringToCodePoints(String str){ StringBuilder StringBuilder = new StringBuilder();str.codePoints()。forEach(cp ->stringbuilder . append("\ \ u & # 034).append(integer . tohexstring(CP)));返回stringbuilder . tostring();}/* * *内码转汉字* @ param code points \ \ U61 \ \ U62 \ \ u4e 00 \ \ U32 \ \ u2b 802 \ \ u 4 eef \ \ U33 \ \ u2b 82 f \ \ U34 \ \ U34 3?4 */public static String codePointsToString(String codePoints){ StringBuilder StringBuilder = new StringBuilder();for(String hexcode point:code points . split("\ \ \ \ u & # 034)){ if(string utils . isnotblank(hexcode point)){ stringbuilder . append(codePointToString(integer . parse int(hexcode point,16)));} }返回stringbuilder . tostring();}/* * *十进制转汉字* @param cp码位汉字内码* @ return */public static string码位tostring(intcp){ stringbuilder *** = new stringbuilder();if(character . i***mpcodepoint(CP)){ *** . append((char)CP);} else if(character . isvalidcodepoint(CP)){ *** . append(character . highsurrogate(CP));*** . append(character . low surrogate(CP));} else { *** . append('?');} return *** . tostring();}支持5位编码的在线转换工具
http://***.jdkba.com/char
本文来自安安分分做我自我投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/571091.html