Java - 从String中删除奇怪的字符

时间:2011-03-28 17:26:19

标签: java string

如何从字符串中删除奇怪且不需要的Unicode字符(例如带问号的黑色菱形)?

更新:

请告诉我对应于“带有问号的黑色钻石”的Unicode字符串或正则表达式。

11 个答案:

答案 0 :(得分:17)

带有问号的黑色钻石不是unicode字符 - 它是字体无法显示的占位符。如果字符串中存在的字形不在您用于显示该字符串的字体中,您将看到占位符。这被定义为U + FFFD: 。它的外观取决于您使用的字体。

您可以使用java.text.normalizer删除不在“普通”ASCII字符集中的Unicode字符。

答案 1 :(得分:16)

您可以使用String.replaceAll("[my-list-of-strange-and-unwanted-chars]","")

没有Character.isStrangeAndUnWanted(),你必须定义你想要的东西。

如果要删除控制字符,可以执行

String str = "\u0000\u001f hi \n";
str = str.replaceAll("[\u0000-\u001f]", "");

打印hi(保留空间)。

编辑如果你想知道任何16位字符的unicode,你可以做

int num = string.charAt(n);
System.out.println(num);

答案 2 :(得分:6)

要从字符串中删除非拉丁语符号,请使用以下代码:

String s = "小米体验版 latin string 01234567890";
s = s.replaceAll("[^\\x00-\\x7F]", "");

输出字符串将是:     "拉丁字符串01234567890"

答案 3 :(得分:4)

贾斯汀托马斯很接近,但这可能更接近你所期待的:

String nonStrange = strangeString.replaceAll("\\p{Cntrl}", ""); 

选择器\ p {Cntrl}选择“A control character: [\x00-\x1F\x7F].

答案 4 :(得分:2)

使用String.replaceAll( )

String clean = "♠clean".replaceAll('♠', '');

答案 5 :(得分:0)

将要删除的字符放在数组列表中,然后使用replaceAll方法遍历数组:

String str = "Some text with unicode !@#$";
ArrayList<String> badChar = new ArrayList<String>();
badChar= ['@', '~','!']; //modify this to contain the unicodes

for (String s : badChar) {
   String resultStr = str.replaceAll(s, str);
}

你最终会得到一个清理过的字符串“resultStr” 没有测试这个,但是沿着这条线。

答案 6 :(得分:0)

当我使用getAsciiStream将clob转换为字符串时,发生了同样的情况。

使用

有效地解决了它
public String getstringfromclob(Clob cl)
{
    StringWriter write = new StringWriter();
    try{
        Reader read  = cl.getCharacterStream();     
    int c = -1;
    while ((c = read.read()) != -1)
    {
        write.write(c);
    }
    write.flush();
    }catch(Exception ec)
    {
        ec.printStackTrace();
    }
    return write.toString();

}

答案 7 :(得分:0)

过滤英文,中文,数字和标点符号

str = str.replaceAll("[^!-~\\u20000-\\uFE1F\\uFF00-\\uFFEF]", "");

答案 8 :(得分:0)

您获得的文本很可能是用UTF-8以外的其他语言编码的。您可以做的是不允许上传具有其他编码(例如Latin-1)的文本:

try {

  CharsetDecoder charsetDecoder = StandardCharsets.UTF_8.newDecoder();
  charsetDecoder.onMalformedInput(CodingErrorAction.REPORT);

  return IOUtils.toString(new InputStreamReader(new FileInputStream(filePath), charsetDecoder));
}
catch (MalformedInputException e) {
  // throw an exception saying the file was not saved with UTF-8 encoding.
}

答案 9 :(得分:0)

我做了另一种方式。我将替换所有未定义的字母(( ^ )):

str.replaceAll("[^a-zA-Z0-9:;.?! ]","")

例如“小米体验版拉丁字符串01234567890” 我们将得到:“拉丁字符串01234567890”

答案 10 :(得分:-3)

你不能因为字符串是不可变的。

但是,可以创建一个删除了不需要的字符的新字符串。查找String#replaceAll()。