【问题标题】:Special characters \0 {NUL} in JavaJava中的特殊字符\0 {NUL}
【发布时间】:2012-12-13 10:22:13
【问题描述】:

如何替换字符串中的\0(NUL)?

String b = "2012yyyy06mm";               // sth what i want
String c = "2\0\0\0012yyyy06mm";
String d = c.replaceAll("\\\\0", "");    // not work
String e = d.replace("\0", "");          // er, the same
System.out.println(c+"\n"+d+"\n"+e);

String bb = "2012yyyy06mm";
System.out.println(b.length() + " > " +bb.length());  

以上代码将在控制台打印 12 > 11。糟糕,发生了什么事?

String e = c.replace("\0", "");
System.out.println(e);      // just print 2(a bad character)2yyyy06mm

【问题讨论】:

    标签: java string null-terminated


    【解决方案1】:

    您的字符串"2\0\0\0012yyyy06mm" 不是以2 {NUL} {NUL} {NUL} 0 1 2 开头,而是包含2 {NUL} {NUL} {SOH} 2

    \001 被视为单个 ASCII 1 字符 (SOH) 而不是 NUL 后跟 1 2

    结果是只删除了两个字符,而不是三个。

    我认为除了将字符串分开之外,没有其他方法可以表示缩写 octal escape 之后的数字:

    String c = "2" + "\0\0\0" + "012yyyy06mm";
    

    或者,在(最后一个)八进制转义中指定所有三个数字,以便以下数字不会被解释为八进制转义的一部分:

    String c = "2\000\000\000012yyyy06mm";
    

    完成此操作后,根据您的线路替换 "\0"

    String e = c.replace("\0", "");
    

    会正常工作。

    【讨论】:

    • 嗨,寻求帮助。字符串 c = "2\0\0\0012yyyy06mm";字符串 e = c.replace("\0", ""); System.out.println(e); // 只打印 22yyyy06mm
    • @user1900556 是的,因为仍然嵌入其中的\001(在两个“2”之间)是不可见的。关键是您拥有的字符串c 不包含您认为的内容。
    • @user1900556 我向你展示了 - 要么将你的八进制转义符完全填充到三位数,要么将字符串分开。无论哪种方式,您都必须修复 c 的分配 - .replace("\0", ...) 很好。
    • @user1900556 \001一个字符,不是2、3或4,也可以写成\u0001,仍然是一个字符。注意:空格可以写成\040\u0020,但总是一个字符。您不能只替换字符的一部分,也无法确定它是如何定义的。
    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 2012-09-08
    • 1970-01-01
    • 2011-04-20
    • 2019-02-09
    • 2015-05-24
    • 1970-01-01
    相关资源
    最近更新 更多