国际码和内码的转换在线(区位码转国标码工具)
程序员文章站
2023-11-21 18:02:16
我先考一考你,你说这个字符串(ab一2?仯3?4)有多少个字符?这时候你也许开始数了,123…9个,没错,确实我们肉眼确实是看到了9个,java代码如下:有没有发现java判断出来的不是9...
我先考一考你,你说这个字符串(ab一2?仯3?4)有多少个字符?
这时候你也许开始数了,123…9个,没错,确实我们肉眼确实是看到了9个,java代码如下:
有没有发现java判断出来的不是9,而是12!!!
那是因为这个字符串中有2个字符ab一2?仯3?4用黄色表示,实际上utf-8已经满足不了,? 见下图:
java的string是使用utf-16来表示的,u+0000-u+ffff都ok,但是只要是下列这个区间的字符都无法用常规手段处理,5位内码的,用length都无法正确判断其长度
cjk unified ideographs extension b (u+20000 through u+2a6dd)
cjk unified ideographs extension c (u+2a700 through u+2b734)
cjk unified ideographs extension d (u+2b740 through u+2b81d)
cjk unified ideographs extension e (u+2b820 through u+2cea1)
cjk unified ideographs extension f (u+2ceb0 through u+2ebe0)
具体也可以查看官方资料 ,了解unicode,utf-8,utf-16,utf-32的区别。
如下图,可以通过character中的codepointcount来得到字符数量。
进入主题
jdk自带的character类特别好用,汉字转内码,内码转汉字具体功能请参考下面的代码
/**
* 字符串转16进制内码
* @param str ab一2?仯3?4
* @return \u61\u62\u4e00\u32\u2b802\u4eef\u33\u2b82f\u34\u34
*/
public static string stringtocodepoints(string str) {
stringbuilder stringbuilder = new stringbuilder();
str.codepoints().foreach(cp -> stringbuilder.append("\u").append(integer.tohexstring(cp)));
return stringbuilder.tostring();
}
/**
* 内码转汉字
* @param codepoints \u61\u62\u4e00\u32\u2b802\u4eef\u33\u2b82f\u34\u34
* @return ab一2?仯3?4
*/
public static string codepointstostring(string codepoints) {
stringbuilder stringbuilder = new stringbuilder();
for(string hexcodepoint : codepoints.split("\\u")){
if(stringutils.isnotblank(hexcodepoint)) {
stringbuilder.append(codepointtostring(integer.parseint(hexcodepoint, 16)));
}
}
return stringbuilder.tostring();
}
/**
* 十进制转汉字
* @param cp code point 汉字内码
* @return
*/
public static string codepointtostring(int cp) {
stringbuilder sb = new stringbuilder();
if (character.isbmpcodepoint(cp)) {
sb.append((char) cp);
} else if (character.isvalidcodepoint(cp)) {
sb.append(character.highsurrogate(cp));
sb.append(character.lowsurrogate(cp));
} else {
sb.append('?');
}
return sb.tostring();
}
支持5位编码的在线转换工具