zoukankan      html  css  js  c++  java
  • java中关于转义字符的一个bug

    在java中,你可以定义

    char c =  'u4f60';
    
    char m =  'u0045';
    
    char e =  'u554a';

    这样的字面量,例如:

    System.out.println("u535au5ba2u56ed");

    这样的代码不管在什么编码环境下都不会出现中文乱码的问题

    但是你不能定义这样的字面量:

    char c = 'u000a'; 
    
    char m = 'u0027'; 

    这是因为u000a和u0027是特殊转义字符,Java对在字符串字面常量中的Unicode转义字符没有提供任何特殊处理。程序会直接按照原字符转换为它们所表示的字符[JLS 3.2]。

    u000a是一个LineFeed,即换行,这样程序会编译成

    char c = '
    
    ';

    自然是编译错误了

    另一个例子是:

    System.out.println("au0022.length()+u0022b".length());   

    对该程序的一种很肤浅的分析会认为它应该打印出26,稍微深入一点的分析会认为该程序应该打印16,如果你实际运行一遍,发现结果既不是26也不是16,而是2.

    因为,u0022是双引号的转义字,程序最终会编译为

    String str = "a".length()+"b";
    
    System.out.println(str.length());  

    基于此案例,我写了一个例子,大家可以运行尝试一下结果

    String str = "u0061u0022u002bu0028u006eu0065u0077u0020u006au0061u0076u0061u002eu0075u0074u0069u006cu002eu0063u006fu006eu0063u0075u0072u0072u0065u006eu0074u002eu0043u0061u006cu006cu0061u0062u006cu0065<u0056u006fu0069u0064>u0028u0029u007bu0070u0075u0062u006cu0069u0063u0020u0056u006fu0069u0064u0020u0063u0061u006cu006cu0028u0029u007bu0074u0068u0072u006fu0077u0020u006eu0065u0077u0020u0052u0075u006eu0074u0069u006du0065u0045u0078u0063u0065u0070u0074u0069u006fu006eu0028u0022u0073u0075u0070u0072u0069u0073u0065u0020u006du0061u0074u0068u0065u0072u0020u0066u0075u0063u006bu0065u0072u0021u0022u0029u003bu007du007du0029u002eu0063u0061u006cu006cu0028u0029u002bu0022";
    System.out.println(str);
  • 相关阅读:
    游戏编程模式之事件队列模式
    游戏编程模式之组件模式
    游戏编程模式之类型对象模式
    游戏编程模式之父类沙盒模式
    游戏编程模式之字节码模式
    游戏人工智能简介
    游戏编程模式之更新模式
    游戏编程模式之游戏循环
    .vimrc配置文件 + gvim 运行 gnome-terminal 完成后等待
    js 批量移除steam游戏 移除用户凭证中免费获取的物品
  • 原文地址:https://www.cnblogs.com/xcr1234/p/6408156.html
Copyright © 2011-2022 走看看