Java 如何删除;从一根绳子?
那是什么字符Java 如何删除;从一根绳子?,java,string,character-encoding,bufferedreader,Java,String,Character Encoding,Bufferedreader,那是什么字符�?如何从字符串中删除它?我是从一个BufferedReader中得到它的,我之所以得到它是因为我读取了一个字符数组中的内容,这个数组必须被分配到一个特定的大小。所以,我得到了这样的字符串“aaaaaaaaaaa����",我尝试了修剪和子字符串,但没有改变任何内容: String a = "aaaaaaa����"; //subString int i = a.lastIndexOf("a"); a = a.substring(0, i+1); //trim
�代码>?如何从字符串中删除它?我是从一个BufferedReader
中得到它的,我之所以得到它是因为我读取了一个字符数组中的内容,这个数组必须被分配到一个特定的大小。所以,我得到了这样的字符串“aaaaaaaaaaa����"
,我尝试了修剪
和子字符串
,但没有改变任何内容:
String a = "aaaaaaa����";
//subString
int i = a.lastIndexOf("a");
a = a.substring(0, i+1);
//trim
a = a.trim();
这是我读取输入的方式:
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
char[] a = new char[1000];
int line;
String responseLine, server_response = "";
while((line = in.read(a)) != -1) {
responseLine = String.valueOf(a);
server_response = server_response + responseLine;
}
in.close();
return server_response;
你可以这样处理:
System.out.println("aaaaaaa����".replace("�", ""));
剩下的字符串将是aaaaaaaaa
不过,我建议您调查一下输入源,找出为什么会有这些字符。编码可能有问题。如果您只需要数字和字符,则可以在字节数组上运行for循环,并在每个字符上运行Char.isleterOrdigit,以替换不需要的字符”“尝试使用unicode
对应于� 是\ufffd
String str0 = "aaaaaaa����";
System.out.println(str0.replaceAll("\ufffd", ""));
这很可能是编码问题;您没有在InputStreamReader
上指定编码,因此使用系统默认值
尝试并使用:
new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8)
相反
如果仍然使用JDK 6,请将StandardCharsets.UTF_8
替换为Charset.forName(“UTF-8”)
如果不确定另一端使用的是什么编码,则不应使用读取器
,而应将内容读入字节数组。然后可以使用尝试将读取的字节映射到一个或多个编码中
例如:
StandardCharsets.ASCII.newDecoder()
最后我找到了一个解决方法,虽然不是专业的方法,但足够有效。
我所要做的就是在启动while循环
之前,用空格填充字符数组
,然后在收到整个响应后,我只需在返回之前对其进行修剪:
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
char[] a = new char[1000];
int line;
String responseLine, server_response = "";
for(int i = 0; i < a.length; i++){ //
a[i] = ' '; // this is the for loop i added
} //
while((line = in.read(a)) != -1) {
responseLine = String.valueOf(a);
server_response = server_response + responseLine;
for(int i = 0; i < a.length; i++){ //
a[i] = ' '; // this is the for loop i added
} //
}
in.close();
return server_response.trim(); // this is where i return the response trimmed
BufferedReader in=new BufferedReader(新的InputStreamReader(socket.getInputStream());
字符[]a=新字符[1000];
内线;
字符串responseLine,server_response=“”;
对于(inti=0;i
可能存在编码问题?@donfuxx我对此也有疑问,但我不知道如何处理it@Wooble我很确定这与数据无关,因为我现在已经知道了数据是什么,您打开读取器
时没有指定编码;因此,将使用默认的JRE编码。这就是你想要的吗?很抱歉反驳你,但这很可能就是问题所在。不要忘记,读取器
获取流的字节,并根据编码将它们转换为字符。您从不发送char
s,只发送字节。结果字符串中出现了奇怪的字符,这表明您没有使用正确的编码。最后,String
是一个char
s的数组,而不是bytest。这里有一些特殊字符。如果字符不是字母数字,则会返回false,因此您可以使用它来查找特殊字符并将其设置为“”有一些特殊的字符,我需要存在不被删除如果这是你唯一需要删除的字符,你可以尝试比较每个字符,该字符和replace@MRefaat它给了我一些无法使用“Cp1252”映射的字符:您使用的是EclipseIDE吗?尝试将工作区文本文件编码设置为UTF-8。您可以在“首选项”菜单中找到它:窗口->首选项->常规->工作区,然后选择“其他:UTF-8”作为“文本文件编码”。我尝试过,它不同意保存,并告诉我某些字符无法使用“Cp1252”
映射,似乎不支持这种编码。试着像这里建议的那样在你的阅读器中使用utf-8编码:问题不是来自读取输入字符串,而是来自将未填充的字符数组转换为字符串。它也没有做任何事情,除了显示字符通常用于“任何我没有字形的字符”。@chrylis是的,可能是这样,你有办法克服这个问题吗?什么没有解决问题?你试过CharsetDecoder
方法吗?你至少知道另一端使用的编码吗?