【问题标题】:How to remove \u200B (Zero Length Whitespace Unicode Character) from String in Java?如何从 Java 中的字符串中删除 \u200B(零长度空白 Unicode 字符)?
【发布时间】:2017-08-15 01:50:46
【问题描述】:

我的应用程序正在使用 Spring IntegrationOutlook 邮箱进行电子邮件轮询。

因为它正在从外部系统(Outlook)接收字符串(电子邮件正文),所以我对它没有控制。

例如,

String emailBodyStr= "rejected by sundar14-\u200B.";

现在我正在尝试从该字符串中删除 unicode 字符\u200B

我已经尝试过。

尝试#1:

emailBodyStr = emailBodyStr.replaceAll("\u200B", "");

尝试#2:

`emailBodyStr = emailBodyStr.replaceAll("\u200B", "").trim();`

尝试#3(使用 Apache Commons):

StringEscapeUtils.unescapeJava(emailBodyStr);

尝试#4:

StringEscapeUtils.unescapeJava(emailBodyStr).trim();

到目前为止没有任何效果

当我尝试使用以下代码打印此字符串时。

logger.info("Comment BEFORE:{}",emailBodyStr);
logger.info("Comment AFTER :{}",emailBodyStr);

Eclipse 控制台中,打印 unicode char,

评论之前:被 sundar14-拒绝。

但相同的代码在 Linux 控制台 中打印 unicode char,如下所示。

之前的评论:被 sundar14-\u200B 拒绝。

我阅读了一些推荐使用 str.replace() 的示例,但请注意示例使用 javascript、PHPnot Java。

【问题讨论】:

  • replaceAll 方法在我尝试时有效。
  • 你是如何测试它的?可以打印吗?
  • 在尝试替换之前,我看到输出中有一个不可打印的字符(显示为“?”),长度为23。替换后,不可打印的字符消失了,长度为22.
  • 您在 IDE 控制台中在哪里看到“?”?您使用的是哪个 IDE?当我使用 str.replaceAll() 时,我也得到了计数 23(之前)和 22(之后),但是当我将此字符串(在 str.replaceAll() 之后)存储在数据库中时 - 我可以在 DB 中看到 '\u200B' .
  • 在 Windows 命令提示符下运行时看到问号。此外,将String 与另一个没有\u200B 创建的比较表明它们是相等的。

标签: java regex string unicode outlook


【解决方案1】:

最后,我可以使用“Unicode Regex”删除“Zero Width Space”字符。

String plainEmailBody = new String();
plainEmailBody = emailBodyStr.replaceAll("[\\p{Cf}]", "");

参考查找 Unicode 字符的类别。

  1. Java 中的字符类。

Character 来自 Java 的类列出了所有这些 un​​icode 类别。

  1. 网站: http://www.fileformat.info/

  1. 网站: http://www.regular-expressions.info/ => Unicode 正则表达式

注意 1:当我从 Outlook 电子邮件正文 收到此字符串时 - 没有我的问题中列出的方法有效。 p>

我的应用程序正在从外部系统接收字符串 (Outlook),所以我无法控制它。

注意 2: 这个 SO answer 帮助我了解了 Unicode 正则表达式

【讨论】:

    猜你喜欢
    • 2018-02-19
    • 2014-08-04
    • 2014-07-04
    • 2012-07-03
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2013-04-03
    相关资源
    最近更新 更多