【问题标题】:Remove formatting from Java String while retaining accented characters从 Java 字符串中删除格式,同时保留重音字符
【发布时间】:2020-12-16 14:50:55
【问题描述】:

如何删除 Java 字符串中的格式,同时保留重音字符?

请参见下面的示例。我的目标是获取 öwnNämé@gmail.com(注意 ?????????????????????.???????????? 已更改为 gmail .com)

String formattedStr = "öwnNämé@????????????????????.????????????";
for(int i=0; i < formattedStr.length(); i++) {
   System.out.print(formattedStr.charAt(i));
}

这是上面的输出。 (奇怪的是,如果我使用print 而不是println,它打印得很好)

ö
w
n
N
ä
m
é
@
?
?
?
?
?
?
?
?
?
?
.
?
?
?
?
?
?

如果我使用Integer.toHexString(formattedStr.codePointAt(i))而不是formattedStr.charAt(i),则这是输出

f6
77
6e
4e
e4
6d
e9
40
1d5f4
ddf4
1d5fa
ddfa
1d5ee
ddee
1d5f6
ddf6
1d5f9
ddf9
2e
1d5f0
ddf0
1d5fc
ddfc
1d5fa
ddfa

【问题讨论】:

  • 您真的想将数学粗体 g 更改为 ASCII g,还是只想打印每个字符?
  • 我的目标是将此字符串转换为 öwnNämé@gmail.com(更改为 ASCII g 等)

标签: java string unicode-string


【解决方案1】:

您可以使用Normalizer.Form.NFKC解决您的问题:

String response = Normalizer.normalize(formattedStr, Normalizer.Form.NFKC);

这将返回一个不带粗体字符的字符串并打印出来。

ö
w
n
N
ä
m
é
@
g
m
a
i
l
.
c
o
m

【讨论】:

  • 谢谢!我从来不知道会调查这个 Normalizer 的事情!
  • 不客气,是的,在这些情况下它是一个有用的库。
【解决方案2】:

@ 之后的字符的代码点高于 0xffff,因此它们不适合单个 char 值。相反,每个这样的字符都表示为两个 char 值,称为代理。这种编码称为 UTF-16。 (在创建 Java 时,Unicode 只有 16 位值,因为没有人想到需要超过 2¹⁶ 个代码点。)

您可以使用java.text.Normalizer 将字符转换为常用形式。 NFKC (compatibility then composition) 规范化形式将保留重音符号和其他变音符号。

String converted = Normalizer.normalize(formattedStr, Normalizer.Form.NFKC);

【讨论】:

  • 感谢NFKC的解释
猜你喜欢
  • 2016-06-26
  • 2010-10-06
  • 2010-12-09
  • 1970-01-01
  • 2021-03-26
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多