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
方法吗?你至少知道另一端使用的编码吗?