簡體   English   中英

刪除字符串中的0字節(UTF-8)字符

[英]Remove 0-byte (UTF-8) characters in String

我目前正在編寫一個多人游戲,現在我正在網絡方面進行工作。 我已經設置了一個數據包系統,並且它的工作方式(至少與Strings一起使用)是它需要使用多個字符,最多只能包含“ X”個字符。 字符將轉換為字節以發送到服務器。 如果少於X個字符,則剩余字節設置為0。問題是,當在服務器上處理此信息並將其轉換為字符串時,0字節字符在我的控制台中是“□”,並且在我的JTextPane中不可見。 如何以一種干凈的方式從字符串中刪除所有這些0字節字符? 我不希望有另一個循環和更多的變量,只是為了在轉換為字符串之前刪除0字節。 沒有人喜歡看起來很臟的代碼。 :p

封包數據:

03100101118000000000971001091051100000000
  • 03 =數據包ID(無關)
  • 100101118000000000 =用戶名(“ dev”)
  • 971001091051100000000 =密碼(“管理員”)

結果字符串:

  • usernameString =“ dev□□□□□□□□□”
  • passwordString =“ admin□□□□□□□”

我試過的

usernameString.replaceAll(new String(new byte[] {0}, "UTF-8"), "");
passwordString.replaceAll(new String(new byte[] {0}, "UTF-8"), "");

但是,這根本沒有更改String。

usernameString = // replace 1 or more \0 at the end of the string
    usernameString.replaceAll("\0+$", "");

\\0是數字值0(有時稱為NUL)的Unicode字符的轉義符。 換一種說法:

System.out.println((int) "\0".charAt(0)); // prints 0

您嘗試的方法似乎也對我有用。 (請參閱Ideone示例 。)不知道為什么它不適合您。 可能還有另一個問題。 確保您正在重新分配結果。 ;

由於所有零都出現在字符串的末尾,因此即使沒有規則表達式也可以解決此問題:

static String trimZeros(String str) {
    int pos = str.indexOf(0);
    return pos == -1 ? str : str.substring(0, pos);
}

usernameString = trimZeros(usernameString);
passwordString = trimZeros(passwordString);

暫無
暫無

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

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