Unicode 转义字符的溃败

 

1、以下代码将打印出什么?

public class test1

{

    public static void main(String args [])

    {

       // /u0022 is the Unicode escape for double quote(")

 

        System.out.println("a/u0022.length() + /u0022b".length());

    }

}

对该程序的一种很肤浅的分析会认为它应该打印 26,因为在两个双引号之间共有 26 个字符。稍微深入的分析会认为能打印 16 个,因为两个 Unicode 转义字符每一个在源文件中都需要 6 个字符来表示,但他们只表示字符串中的一个字符。但是事实上,它打印的既不是 26 也不是 16, 而是 2。

 

原因:Java 对在字符串字面常量中的 Unicode 转义字符没有提供任何特殊处理。编译器在将程序解析成各种符号之前,先将Unicode 转义字符转换成为它们所表示的字符。在该程序中,/u0022 表示的是 ", 因此,该程序可以解析为System.out.println("a".length() + "b".length()),这样就打印出了 2。

 

2、以下代码将打印什么?

/**

 * Generated by the IBM IDL-to-Java compiler, version 1.0

 * from F:/TestRoot/apps/units/include/PolicyHome.idl

 * Wednesday, June 17, 1998 6:44:40 o'clock AM GMT+00:00

 */

public class test2

{

       public static void main(String args [])

       {

              System.out.print("Hell");

              System.out.println("o world");

       }

}

   这个题看起来相当简单,它应该打印 “Hello world”,但实际上,它根本无法通过编译。

原因:问题出在注释的第三行,它包含了字符 /units。这些字符以反斜杠(/)以及紧跟着的字母U 开头,而它(/U)表示的是一个Unicode 转义字符的开始。遗憾的是,这些字符后面没有紧跟四个十六进制的数字,因此,这个Unicode转义字符时病构的,而编译器被要求拒绝该程序。Unicode 转义字符必须是良构的,即使出现在注释中也是如此。

 

3、Java 和 C# 的比较

⑴ public class testJava

{

       public static void Main ()

       {

              System.out.println("/u0022");

       }

}

⑵ using System;

namespace tt

{

       public class testNet

       {

              public static void Main ()

              {

                     Console.WriteLine("/u0022");

              }

       }

}

以上两段代码分别是 java 和 c# 程序的代码,他们都要求输出字符串 /u0022, 在 java 中这样写将不能通过编译,而在 c# 中则打印出一个双引号(“).

原因:Java 对在字符串字面常量中的 Unicode 转义字符没有提供任何特殊处理。而在 c# 中将它转换成普通的字符来处理。若希望打印出 /u0022, 应该将反斜杠(/)进行转义,即(//u0022)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值