删除 String 中的 0 字节 (UTF-8) 字符
Remove 0-byte (UTF-8) characters in String
我目前正在编写一个多人游戏,并且我正在处理它的网络方面的工作。我设置了一个数据包系统,它的工作方式(至少使用字符串)是它需要多个字符,最多 "X" 个字符。字符被转换为字节以发送到服务器。如果少于 X 个字符,则剩余字节设置为 0。问题是在服务器上处理此信息并将其转换为字符串时,0 字节字符在我的控制台中为“□”,并且在我的 JTextPane 中不可见。如何以干净的方式从字符串中删除所有这些 0 字节字符?我不希望有另一个循环和更多变量只是为了在转换为字符串之前删除 0 字节。没有人喜欢看起来脏兮兮的代码。 :p
包数据:
03100101118000000000971001091051100000000
- 03 = 数据包 ID(无关)
- 100101118000000000 = 用户名 ("dev")
- 971001091051100000000 = 密码 ("admin")
结果字符串:
- 用户名字符串 = "dev□□□□□□□□□"
- 密码字符串 = "admin□□□□□□□"
我尝试过的:
usernameString.replaceAll(new String(new byte[] {0}, "UTF-8"), "");
passwordString.replaceAll(new String(new byte[] {0}, "UTF-8"), "");
然而,这根本没有改变字符串。
usernameString = // replace 1 or more [=10=] at the end of the string
usernameString.replaceAll("[=10=]+$", "");
[=12=]
是对数值为 0(有时称为 NUL)的 Unicode 字符的转义。换句话说:
System.out.println((int) "[=11=]".charAt(0)); // prints 0
你试过的方法似乎也对我有用。 (参见 Ideone example。)不知道为什么它不适合你。可能还有另一个问题。确保您正在重新分配结果。 ; )
因为所有的零都出现在字符串的末尾,所以即使没有正则表达式也可以解决这个问题:
static String trimZeros(String str) {
int pos = str.indexOf(0);
return pos == -1 ? str : str.substring(0, pos);
}
usernameString = trimZeros(usernameString);
passwordString = trimZeros(passwordString);
我目前正在编写一个多人游戏,并且我正在处理它的网络方面的工作。我设置了一个数据包系统,它的工作方式(至少使用字符串)是它需要多个字符,最多 "X" 个字符。字符被转换为字节以发送到服务器。如果少于 X 个字符,则剩余字节设置为 0。问题是在服务器上处理此信息并将其转换为字符串时,0 字节字符在我的控制台中为“□”,并且在我的 JTextPane 中不可见。如何以干净的方式从字符串中删除所有这些 0 字节字符?我不希望有另一个循环和更多变量只是为了在转换为字符串之前删除 0 字节。没有人喜欢看起来脏兮兮的代码。 :p
包数据:
03100101118000000000971001091051100000000
- 03 = 数据包 ID(无关)
- 100101118000000000 = 用户名 ("dev")
- 971001091051100000000 = 密码 ("admin")
结果字符串:
- 用户名字符串 = "dev□□□□□□□□□"
- 密码字符串 = "admin□□□□□□□"
我尝试过的:
usernameString.replaceAll(new String(new byte[] {0}, "UTF-8"), "");
passwordString.replaceAll(new String(new byte[] {0}, "UTF-8"), "");
然而,这根本没有改变字符串。
usernameString = // replace 1 or more [=10=] at the end of the string
usernameString.replaceAll("[=10=]+$", "");
[=12=]
是对数值为 0(有时称为 NUL)的 Unicode 字符的转义。换句话说:
System.out.println((int) "[=11=]".charAt(0)); // prints 0
你试过的方法似乎也对我有用。 (参见 Ideone example。)不知道为什么它不适合你。可能还有另一个问题。确保您正在重新分配结果。 ; )
因为所有的零都出现在字符串的末尾,所以即使没有正则表达式也可以解决这个问题:
static String trimZeros(String str) {
int pos = str.indexOf(0);
return pos == -1 ? str : str.substring(0, pos);
}
usernameString = trimZeros(usernameString);
passwordString = trimZeros(passwordString);