我只想将特殊字符转换为它们的UTF-8等效字符。例如,给定一个字符串:Abcds23#$_ss,它应该被转换为Abcds23353695ss。
下面是我如何完成上述转换的:#的十六进制utf-8是23,十进制是35。$的十六进制utf-8是24,十进制是36。_的十六进制utf-8是5f,十进制是95。
我知道我们有String.replaceAll(String regex, String replacement)方法。但是我想用特定的UTF-8等效项替换特定的字符。
我如何在java中做同样的事情?
发布于 2016-07-06 19:28:14
我不知道你是如何定义“特殊字符”的,但是这个函数应该给你一个概念:
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"));
}发布于 2016-07-06 19:52:35
下面使用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将其收集到一个数组中。所以我们可以从这些代码点构造一个新的字符串。完全Unicode安全。
没有分隔符,转换是不可撤消的。
Unicode上的:
Unicode对符号进行编号,称为代码点,从0向上,进入3字节范围。
要以字节进行编码(格式化),存在UTF-8 (多字节)、UTF-16LE和UTF-16BE (2字节序列)和UTF-32 (码位按原样或多或少)。.class文件中的Java string常量采用UTF8格式。一个字符串由UTF-16BE char组成,字符串可以给出如上的代码点。所以java在设计上使用Unicode作为文本。
https://stackoverflow.com/questions/38222253
复制相似问题