字符串标准化

最近做的项目涉及到文本处理, 初一看数据, 很 “脏”, 简体繁体、错别字、英文大小写、全角半角、标点符号等等. 每种情形都需要对应的处理方法, 本文介绍的字符串标准化, 或者称为归一化处理, 主要解决全角半角, 以及特殊符号的情形.

比如这些符号: !~。•﹖, 它们的存在就像 “魔鬼”, 对接下来的正则表达式处理也带来了麻烦, 有时候, 真想不到用户怎么把这些字符输进来的?

言归正传, 这里就要用到字符串标准化. 我很早就想要这样一个工具函数了, 最近阅读 Ansj 的源码时, 发现了这样一个工具, 略加改造就变成我想要的啦^^

基本思路如下:

StringAlert.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private static final char[] CHARCOVER = new char[65536];
static {
for (int i = 0; i < CHARCOVER.length; i++) {
if (i >= '!' && i <= '~') {
CHARCOVER[i] = (char) (i - '!' + '!');
}
}
}
public static String alert(String str) {
if (str == null) {
return null;
}
char[] chars = new char[str.length()];
for (int i = 0; i < chars.length; i++) {
char c = CHARCOVER[str.charAt(i)];
chars[i] = c > 0 ? c : str.charAt(i);
}
return new String(chars);
}

由于应用场景需要, 对于有些字符的转换会做一定特殊化处理, 列表如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CHARCOVER['。'] = '.';
CHARCOVER['•'] = '·';
CHARCOVER['〖'] = '[';
CHARCOVER['〗'] = ']';
CHARCOVER['【'] = '[';
CHARCOVER['】'] = ']';
CHARCOVER['﹔'] = ';';
CHARCOVER['﹕'] = ':';
CHARCOVER['﹖'] = '?';
CHARCOVER['﹗'] = '!';
CHARCOVER['﹟'] = '#';
CHARCOVER['﹠'] = '&';
CHARCOVER['﹡'] = '*';
CHARCOVER['﹢'] = '+';
CHARCOVER['﹣'] = '-';
CHARCOVER['﹤'] = '<';
CHARCOVER['﹥'] = '>';
CHARCOVER['﹩'] = '$';
CHARCOVER['﹪'] = '%';
CHARCOVER['﹫'] = '@';
Henry wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!