我想只将特殊字符转换为UTF-8等效字符。
例如,给定一个字符串:Abcds23#$_ss
,它应该转换为Abcds23353695ss
。
以下是我如何进行上述转换:
#
的十六进制的utf-8是23,十进制的是35. $
的十六进制的utf-8是24,十进制的是十进制的。{{1的十六进制的utf-8是5f,十进制是95。
我知道我们有_
方法。但我想用特定的UTF-8等效替换特定字符。
我如何在java中做同样的事情?
答案 0 :(得分:0)
我不知道你如何定义"特殊字符",但这个功能应该给你一个想法:
public static String convert(String str)
{
StringBuilder buf = new StringBuilder();
for (int index = 0; index < str.length(); index++)
{
char ch = str.charAt(index);
if (Character.isLetterOrDigit(ch))
buf.append(ch);
else
buf.append(str.codePointAt(index));
}
return buf.toString();
}
@Test
public void test()
{
Assert.assertEquals("Abcds23353695ss", convert("Abcds23#$_ss"));
}
答案 1 :(得分:0)
以下使用java 8或更高版本并检查Unicode代码点(符号)是字母还是数字,纯ASCII(&lt; 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
在单个展平流中添加IntStream,toArray
将其收集在一个数组中。所以我们可以从这些代码点构造一个新的String。完全符合Unicode安全。
没有分隔符,转换无法撤消。
关于Unicode:
Unicode 数字符号,称为代码点,从0开始,进入3字节范围。
以字节编码(格式化)存在 UTF-8 (多字节), UTF-16LE 和 UTF-16BE (2字节序列)和 UTF-32 (代码点或多或少)。
.class文件中的Java字符串常量是UTF-8。 String由UTF-16BE char
组成。 String可以给出如上所述的代码点。所以java by design使用Unicode作为文本。