1

我想用java lauguage过滤掉一些像U+1F603这样的unicode的字符。它们是字符串中的各种信息,仅过滤特定的字符。如何?有人可以帮忙吗?谢谢。

4

2 回答 2

1

U+1F603 字符可以写成\uD83D\uDE03Java。

如果您的文本在String yourString变量中,则以下代码应删除出现的特殊字符。

yourString.replace("\uD83D\uDE03", "");
于 2013-09-13T13:55:13.913 回答
0

tl;博士

"happy".replaceAll( "" , "" ) 

快乐的

Java 源代码支持 Unicode

您的 Java 源代码可能包含以 Unicode 定义的超过 140,000 个字符中的任何一个。因此,您可以使用任何此类字符来获得字符串文字。没有必要逃避。

在 Java 18 之前,您可能需要指示您的工具将源代码文件保存为 UTF-8。在 Java 18 及更高版本中,所有平台的默认字符编码为 UTF-8,根据JEP 400: UTF-8 by Default

你的目标,U+1F603,是张开嘴的笑脸

String result = input.replaceAll( "" , "" ) ;  // Replacing target character with empty string, effectively a "remove all" operation. 

例子:

System.out.println(
    "happy".replaceAll( "" , "" ) 
);

请参阅在 IdeOne.com 上实时运行的代码

快乐的

代码点

要在 Java 中处理单个字符,请使用代码点整数。

Unicode 联盟已为每种语言和文字的几乎每个已知字符分配了一个永久标识符编号。目前字符数超过 140,000。分配的数字范围从零到刚刚超过一百万。显然,该数字范围的大部分是未分配的,保留供私人使用或将来使用。

您要删除, U+1F603, SMILING FACE WITH OPEN MOUTH。

假设我们也想删除:

  • , U+1F626, 皱着眉头张着嘴
  • , U+1F637, 带医用口罩的脸

列出这些字符。

String forbidden = "";
List< Integer > forbiddenCodePoints = forbidden.codePoints().boxed().toList() ;

获取分配给输入流的每个字符的代码点流。

String input = "happy  sad ";
IntStream codePoints = input.codePoints();

过滤这些以消除在我们的禁止代码点编号列表中找到的任何内容。对于通过我们测试的代码点int编号,将每个编号附加到StringBuilder. 最后,从中构建一个String对象StringBuilder

String result =
        codePoints
                .filter( codePoint -> ! forbiddenCodePoints.contains( codePoint ) )
                .collect( StringBuilder :: new , StringBuilder :: appendCodePoint , StringBuilder :: append )
                .toString();

跑的时候。

result = happy  sad 

这是一个替代方案,对于单行,使用IntStream#anyMatch.

System.out.println(
        "happy  sad "
                .codePoints()
                .filter( codePoint -> ! "".codePoints().anyMatch(  x -> x == codePoint) )
                .collect( StringBuilder :: new , StringBuilder :: appendCodePoint , StringBuilder :: append )
                .toString()
);

跑的时候。

happy  sad 
于 2021-11-20T22:10:57.880 回答