下使用Java 8以上,检查是否一个Unicode代码点(符号)是一个字母或数字,纯ASCII(< 128),否则输出Unicode代码点作为数值的字符串。
static String convert(String str) {
int[] cps = str.codePoints()
.flatMap((cp) ->
Character.isLetterOrDigit(cp) && cp < 128
? IntStream.of(cp)
: String.valueOf(cp).codePoints())
.toArray();
return new String(cps, 0, cps.length);
}
String.codePoints()
产生一个IntStream,flatMap
增加IntStreams在单个扁平流,并且收集toArray
它在阵列中。所以我们可以从这些代码点构造一个新的String。完全Unicode安全。
如果没有分隔符,转换是不可撤销的。
论的Unicode:
的Unicode数字符号,称为代码点,从0向上,进3字节范围。
要编码(格式化)以字节为单位存在UTF-8(多字节),UTF-16LE和UTF-16BE(2字节序列)和UTF-32(码分或多或少)。 .class文件中的Java字符串常量使用UTF-8。字符串由UTF-16BE char
组成。和String可以给出如上的代码点。所以Java设计使用Unicode来表示文本。
为什么“#$”变成“353695”? – niceman
以下是转换发生的方式: #的十六进制utf-8为23,十进制为35 $为十六进制的utf-8为24,十进制为36 _为十六进制的utf-8为5f和十进制是65 Sry编辑它的问题是Abcds23#$ _ss而不是Abcds23#$ ss – user2713255
不要将更多信息放入注释中,而是更新您的问题。 – GhostCat