2016-07-06 81 views
0

我只想将特殊字符转换为UTF-8等效字符。 例如给出一个字符串:Abcds23#$_ss,它应该转换为Abcds23353695ss用UTF-8编码字符java替换字符串中的特殊字符?

以下是如何做了上述的转换: 以十六进制的UTF-8为#是23和小数是35进制中的UTF-8为$是24和小数是36. UTF- 8在十六进制_是5f和十进制是95.

我知道我们有String.replaceAll(String regex, String replacement)方法。但我想用特定的UTF-8等效替换特定的字符。

如何在java中执行相同操作?

+0

为什么“#$”变成“353695”? – niceman

+0

以下是转换发生的方式: #的十六进制utf-8为23,十进制为35 $为十六进制的utf-8为24,十进制为36 _为十六进制的utf-8为5f和十进制是65 Sry编辑它的问题是Abcds23#$ _ss而不是Abcds23#$ ss – user2713255

+1

不要将更多信息放入注释中,而是更新您的问题。 – GhostCat

回答

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")); 
} 
+0

是的,除了字母数字字符以外的任何字符在我的情况下都是特殊字符。您的程序如何将特殊字符转换为UTF-8等效,因为我无法在任何地方看到UTF-8?或者UTF-8是java中使用的默认编码? – user2713255

+0

@ user2713255我认为秘密在于'Character.codePointAt',是的,我认为UTF-8是默认的 – niceman

+0

@ user2713255'Character.codePointAt'返回给定索引处的Unicode代码点。 – splash

0

下使用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-16LEUTF-16BE(2字节序列)和UTF-32(码分或多或少)。 .class文件中的Java字符串常量使用UTF-8。字符串由UTF-16BE char组成。和String可以给出如上的代码点。所以Java设计使用Unicode来表示文本。

+0

为什么需要'cp <128'条件,它有什么作用?在我的情况下,字母和数字以外的任何字符都被认为是特殊字符 – user2713255

+0

有像'ü',希腊字母,阿拉伯数字等字母。纯ASCII高达127,使用类字符人们也可以制定它的脚本/块是ASCII,但这有点冗长。 –