簡體   English   中英

Java - 從字符串中刪除奇怪的字符

[英]Java - removing strange characters from a String

如何從字符串中刪除奇怪和不需要的 Unicode 字符(例如帶問號的黑色菱形)?

更新:

請告訴我對應於“帶有問號的黑色菱形”的 Unicode 字符串或正則表達式。

帶問號的黑色菱形不是 Unicode 字符——它是您的字體無法顯示的字符的占位符。 如果字符串中存在的字形不在用於顯示該字符串的字體中,您將看到占位符。 這被定義為 U+FFFD: 。 它的外觀因您使用的字體而異。

您可以使用java.text.normalizer刪除不在“正常”ASCII 字符集中的 Unicode 字符。

您可以使用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);

要從字符串中刪除非拉丁符號,我使用以下代碼:

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

輸出字符串將是:“拉丁字符串 01234567890”

賈斯汀·托馬斯 (Justin Thomas) 很接近,但這可能更接近您要查找的內容:

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

選擇器 \\p{Cntrl} 選擇“ 一個控制字符:[\\x00-\\x1F\\x7F]。

使用String.replaceAll()

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

我是反過來做的。 我替換了所有未定義的字母 (( ^ )):

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

所以對於像“小米體驗版latin string 01234567890”這樣的詞,我們會得到:“latin string 01234567890”

當我使用 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();

}

過濾英文、中文、數字和標點符號

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

將要刪除的字符放在數組列表中,然后使用 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" 還沒有測試過這個,但是沿着線。

很可能您得到的文本是用 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.
}

你不能,因為字符串是不可變的。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM