用UTF-8编码的字符java替换字符串中的特殊字符?

时间:2016-07-06 10:52:25

标签: java regex

我想只将特殊字符转换为UTF-8等效字符。 例如,给定一个字符串:Abcds23#$_ss,它应该转换为Abcds23353695ss

以下是我如何进行上述转换:  #的十六进制的utf-8是23,十进制的是35. $的十六进制的utf-8是24,十进制的是十进制的。{{1的十六进制的utf-8是5f,十进制是95。

我知道我们有_方法。但我想用特定的UTF-8等效替换特定字符。

我如何在java中做同样的事情?

2 个答案:

答案 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作为文本。