我正在使用一个框架,它会不时地返回带有"空"字符的格式错误的字符串.
例如,"foobar"表示为:[,f,o,o,b,a,r]
第一个字符不是空格(''),因此System.out.printlin()将返回"foobar"而不是"foobar".然而,String的长度是7而不是6.显然这使得大多数String方法(equals,split,substring,..)无用.有没有办法从字符串中删除空字符?
我试着像这样构建一个新的String:
StringBuilder sb = new StringBuilder();
for (final char character : malformedString.toCharArray()) {
if (Character.isDefined(character)) {
sb.append(character);
}
}
sb.toString();
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用.与以下代码相同:
StringBuilder sb = new StringBuilder();
for (final Character character : malformedString.toCharArray()) {
if (character != null) {
sb.append(character);
}
}
sb.toString();
Run Code Online (Sandbox Code Playgroud)
我也无法检查这样的空字符:
if (character == ''){
//
}
Run Code Online (Sandbox Code Playgroud)
显然字符串有问题..但我无法更改我正在使用的框架或等待它们修复它(如果它是框架中的错误).我需要处理这个String并对其进行sanatize.
有任何想法吗?
Bal*_*usC 16
它可能是由NULL表示的NULL字符\0.你可以摆脱它String#trim().
要确定准确的代码点,请执行以下操作:
for (char c : string.toCharArray()) {
System.out.printf("U+%04x ", (int) c);
}
Run Code Online (Sandbox Code Playgroud)
然后你可以在这里找到确切的字符.
更新:根据更新:
任何人都知道如何只包括一系列有效字符而不是排除95%的UTF8范围?
你可以在正则表达式的帮助下做到这一点.请参阅@polygenelubricants的答案和答案.
另一方面,您也可以在其根目录中修复问题,而不是解决问题.要么更新文件以摆脱BOM标记,这是将UTF-8文件与现在无价值的其他文件区分开来的传统方式,或使用Reader识别和跳过BOM的文件.另见这个问题.
pol*_*nts 14
在这种情况下,正则表达式是从不需要的Unicode字符清除字符串的适当方法.
String sanitized = dirty.replaceAll("[\uFEFF-\uFFFF]", "");
Run Code Online (Sandbox Code Playgroud)
这将替换所有char在\uFEFF-\uFFFF用空字符串范围.
该[...]构造被称为一个字符类,例如[aeiou]匹配任何一个小写元音,[^aeiou]匹配任何东西.
您可以执行以下两种方法之一:
replaceAll("[blacklist]", "")replaceAll("[^whitelist]", "")从字符串中删除 UTF-8 BOM 的一种非常简单的方法,使用 Denis Tulskiy 建议的子字符串。不需要循环。只需检查标记的第一个字符,并在需要时跳过它。
public static String removeUTF8BOM(String s) {
if (s.startsWith("\uFEFF")) {
s = s.substring(1);
}
return s;
}
Run Code Online (Sandbox Code Playgroud)
在使用 Apache HTTPClient EntityUtil 从网络服务器读取时,我需要将此添加到我的代码中。网络服务器没有发送空白标记,而是在读取输入流时被拉入。原始文章可以在这里找到。
| 归档时间: |
|
| 查看次数: |
31730 次 |
| 最近记录: |