java反斜杠+数字转义问题

时间:2022-12-06 14:45:32
我用java写一个请求DNS的程序,DNS返回的数据中包含有字符 \ ,比如DNS的返回结果应该是“\2.\1.domain.com”,我用一个String变量接收这个返回结果,结果\2和\1被转义成某些无法显示的字符了,无法正确显示\2.\1.domain.com,有什么办法可以解决这个问题吗?

14 个解决方案

#1


把java文件里的"\"改成"\\"试试

#2


我java文件中没有任何 \ 字符,是从网络中得到一串数据,具体点就是请求DNS,DNS返回一个NAPTR记录中的内容,这个内容里面包含有 \ 字符,我想把这些内容按原样输出,但是java的String变量接收到这些数据后遇到 \ 就自动转义了,改怎么做才能不让他转义

#3


\\ 代表 \ 双反斜杠就行了

#4


你们没理解我意思,我贴一下我的代码吧,看注释那地方,数据不是我自己可以控制的,所以没办法用\\代替\

    DirContext ctx = null;
try {
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
    env.put(Context.PROVIDER_URL, OID_DNS_SERVER);
    String dns_attributes[] = { "NAPTR" };

    ctx = new InitialDirContext(env);
    Attributes attrs1 = ctx.getAttributes(regexRequest, dns_attributes);
    if (attrs1 == null) {

    } else {
Attribute attr = attrs1.get(dns_attributes[0]);
if (attr != null) {
Enumeration vals = attr.getAll();
if (vals.hasMoreElements()) {

                        //就是这里接收到的DNS数据中包含有 \ 字符,naptrRecord显示的时候被转义了,显示乱码
String naptrRecord = vals.nextElement().toString();
                }
}
    }
} catch (Exception e) {

}

#5


自己顶一下,没人遇到过这样的问题吗?

#6


LZ确信是发生转义的问题吗?
按正常的字符串解析,java内部会把\变成\\转义的
比如你在网页上输入一个\,java端获得的就是"\\",不可能只获得一个"\"(这样是非法字符串,通不过的),所以估计问题不在这里,看LZ的输出结果,好像是编码不对造成的
记得有人发过帖子说java通信时接收端多了几个非法字符的问题(\ufffd之类的),LZ可以搜索一下看看

#7


你的意思是说\是系统返回的.不能自行处理吧.

#8


能不能用replace?

#9


楼主认真考虑六楼的建议,我也同意六楼的建议

#10


引用 6 楼 qybao 的回复:
LZ确信是发生转义的问题吗?
按正常的字符串解析,java内部会把\变成\\转义的
比如你在网页上输入一个\,java端获得的就是"\\",不可能只获得一个"\"(这样是非法字符串,通不过的),所以估计问题不在这里,看LZ的输出结果,好像是编码不对造成的
记得有人发过帖子说java通信时接收端多了几个非法字符的问题(\ufffd之类的),LZ可以搜索一下看看


有可能,我接收的时候就是乱码了,我在DNS服务器上看了数据确实是 \002.\001.domainname.com ,我一发起请求,返回来接收到的数据中那部分包含 \ 的字符就变成乱码了。DNS服务器的数据不能改,我该怎么进行转换或者怎么读取数据才能避免这个问题?

#11


public static void main(String... aArgs) throws IOException{      
      String s = "\2.\1.domain.com";    
      System.out.println(filterCtrlChars(s));
      
  }

  public static String filterCtrlChars(String source){
      StringBuffer sf = new StringBuffer();
      for (char c : source.toCharArray()){
          if (Character.isISOControl(c)){
              sf.append("\\")
                    .append(Integer.toOctalString(c));       
          }else{
              sf.append(c);
          }
      }
      return sf.toString();
  }

没想到其他好的解决办法,因为string中已经不存在转义符了,已经连同后面的数字转成了8进制

#12


引用 8 楼 junjian1989 的回复:
能不能用replace?

楼主可以考虑8楼的  把得到的String处理一下
把\全部替换成\\

#13


过来顶一下!

#14


一般都是用\\,更保险

#1


把java文件里的"\"改成"\\"试试

#2


我java文件中没有任何 \ 字符,是从网络中得到一串数据,具体点就是请求DNS,DNS返回一个NAPTR记录中的内容,这个内容里面包含有 \ 字符,我想把这些内容按原样输出,但是java的String变量接收到这些数据后遇到 \ 就自动转义了,改怎么做才能不让他转义

#3


\\ 代表 \ 双反斜杠就行了

#4


你们没理解我意思,我贴一下我的代码吧,看注释那地方,数据不是我自己可以控制的,所以没办法用\\代替\

    DirContext ctx = null;
try {
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
    env.put(Context.PROVIDER_URL, OID_DNS_SERVER);
    String dns_attributes[] = { "NAPTR" };

    ctx = new InitialDirContext(env);
    Attributes attrs1 = ctx.getAttributes(regexRequest, dns_attributes);
    if (attrs1 == null) {

    } else {
Attribute attr = attrs1.get(dns_attributes[0]);
if (attr != null) {
Enumeration vals = attr.getAll();
if (vals.hasMoreElements()) {

                        //就是这里接收到的DNS数据中包含有 \ 字符,naptrRecord显示的时候被转义了,显示乱码
String naptrRecord = vals.nextElement().toString();
                }
}
    }
} catch (Exception e) {

}

#5


自己顶一下,没人遇到过这样的问题吗?

#6


LZ确信是发生转义的问题吗?
按正常的字符串解析,java内部会把\变成\\转义的
比如你在网页上输入一个\,java端获得的就是"\\",不可能只获得一个"\"(这样是非法字符串,通不过的),所以估计问题不在这里,看LZ的输出结果,好像是编码不对造成的
记得有人发过帖子说java通信时接收端多了几个非法字符的问题(\ufffd之类的),LZ可以搜索一下看看

#7


你的意思是说\是系统返回的.不能自行处理吧.

#8


能不能用replace?

#9


楼主认真考虑六楼的建议,我也同意六楼的建议

#10


引用 6 楼 qybao 的回复:
LZ确信是发生转义的问题吗?
按正常的字符串解析,java内部会把\变成\\转义的
比如你在网页上输入一个\,java端获得的就是"\\",不可能只获得一个"\"(这样是非法字符串,通不过的),所以估计问题不在这里,看LZ的输出结果,好像是编码不对造成的
记得有人发过帖子说java通信时接收端多了几个非法字符的问题(\ufffd之类的),LZ可以搜索一下看看


有可能,我接收的时候就是乱码了,我在DNS服务器上看了数据确实是 \002.\001.domainname.com ,我一发起请求,返回来接收到的数据中那部分包含 \ 的字符就变成乱码了。DNS服务器的数据不能改,我该怎么进行转换或者怎么读取数据才能避免这个问题?

#11


public static void main(String... aArgs) throws IOException{      
      String s = "\2.\1.domain.com";    
      System.out.println(filterCtrlChars(s));
      
  }

  public static String filterCtrlChars(String source){
      StringBuffer sf = new StringBuffer();
      for (char c : source.toCharArray()){
          if (Character.isISOControl(c)){
              sf.append("\\")
                    .append(Integer.toOctalString(c));       
          }else{
              sf.append(c);
          }
      }
      return sf.toString();
  }

没想到其他好的解决办法,因为string中已经不存在转义符了,已经连同后面的数字转成了8进制

#12


引用 8 楼 junjian1989 的回复:
能不能用replace?

楼主可以考虑8楼的  把得到的String处理一下
把\全部替换成\\

#13


过来顶一下!

#14


一般都是用\\,更保险