【发布时间】:2013-09-17 22:24:17
【问题描述】:
我想过滤掉一些 unicode 的字符,比如 U+1F603,使用 java lauguage。 它们是字符串中的各种信息,只过滤特定的字符。如何?有人可以帮忙吗? 谢谢。
【问题讨论】:
-
过滤掉是什么意思?
标签: java unicode decode unicode-string unicode-escapes
我想过滤掉一些 unicode 的字符,比如 U+1F603,使用 java lauguage。 它们是字符串中的各种信息,只过滤特定的字符。如何?有人可以帮忙吗? 谢谢。
【问题讨论】:
标签: java unicode decode unicode-string unicode-escapes
U+1F603 字符在Java中可以写成\uD83D\uDE03。
如果您的文本位于 String yourString 变量中,则以下代码应删除出现的特殊字符。
yourString.replace("\uD83D\uDE03", "");
【讨论】:
[\uD800-\uDFFF] 范围内的所有字符。但为什么?您要解决的问题是什么?
"happy?".replaceAll( "?" , "" )
开心
您的 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( "?" , "" )
);
看到这个code run live at IdeOne.com。
开心
要在 Java 中处理单个字符,请使用 code point 整数。
Unicode 联盟已为每种语言和文字的几乎每个已知字符分配了一个永久标识符号。目前字符数超过 140,000。分配的数字范围从零到刚刚超过一百万。显然,该数字范围的大部分未分配,保留供私人使用或将来使用。
您要删除?、U+1F603、张开嘴的笑脸。
假设我们也想删除:
?, U+1F626, 皱着眉头张着嘴?, U+1F637, 戴医用口罩的脸列出这些字符。
String forbidden = "???";
List< Integer > forbiddenCodePoints = forbidden.codePoints().boxed().toList() ;
获取分配给输入流的每个字符的代码点流。
String input = "happy ? sad ?";
IntStream codePoints = input.codePoints();
过滤这些以消除在我们的禁止代码点编号列表中找到的任何内容。对于通过我们测试的代码点int 数字,将每个数字附加到StringBuilder。最后,从 StringBuilder 构建一个 String 对象。
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
【讨论】: