不一样的UniCode

不一样的UniCode

什么是UniCode

UniCode其实是一种编码标准,也被称为万国码,单一码,是计算机科学领域里的一种业界标准,Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

我们在跨平台开发时就可以采用UniCode统一解决编码问题,那么UniCode仅限于解决编码问题吗?当然绝对不是,UniCode还可以玩的花里胡哨。

不一样的UniCode

看下面一个案例,到底能输出什么值呢?

public class TestUniCode {
    public static void main(String[] args) {
        int a=1;
        // \u000d \u0061\u002b\u002b\u003b
        System.out.println(a);
    }
}

这个明眼一看,这不是非常简单吗?JAVA并不会执行注释内容,所以打印出来的肯定是a=1啊,这个不可能有问题啊,但是结果真是这样吗?

结果展示

显然是注释中的代码生效了,这样是不是有点怀疑人生了,明明JAVA代码可以采用双斜杠注释,为什么双斜杠会没有生效呢?

这就是UniCode的魅力了,编译过程中会将JAVA代码中的UniCode编码翻译为对应的字符。下面来验证一波

public class TestUniCode1 {
    public static void main(String[] args) {
        System.out.println("5 + 10 = \u0022+ (5+10) + \u0022");
    }
}

按照语句这里都会被解释为字符串也就是原样输出,可结果是

为什么呢?将上面的Java代码进行编译,查看编译后的class文件

// 编译后的class文件
public class TestUniCode1 {
    public TestUniCode1() {
    }

    public static void main(String[] args) {
        System.out.println("5 + 10 = 15");
    }
}

JAVA将代码中的UniCode翻译为对应的字符串,将\u0022翻译为了双引号半边 ",相当于如下JAVA代码

System.out.println("5 + 10 = "+ (5+10) + "");

其实我们除了\u0022外,还有很多特殊字符,对照表如下所示

Unicode转义字符含义Unicode转义字符含义
\u000a换行符 \n\u0022双引号半边 "
\u000d回车符 \r\u002b加号 +
\u007d大括号右半部 }\u003b分号 ;
\u007b大括号左半部 {\u0061 – \u007a字符 a-z
\u0041 – \u005a字符 A-Z

所以这也能解释上面的第一个问题了,为什么输出的a=2呢?

首先根据对照表我们可以知道\u000d为回车符\r,也就是说在双斜杠后面回车了,那么后面的UniCode是什么呢?这个可以借助网上的一些UniCode的在线翻译工具,可以参考https://c.runoob.com/front-end/3602/

我们可以很清晰的看到后面的代码为a++;那么一切都清楚了,我们可以将a=2的代码等价翻译如下所示

public static void main(String[] args) {
    int a=1;
    //
    a++;
    System.out.println("==结果打印=="+a);
}

其它好玩的案例

除了上面提到的一个案例外,还有几个给大家参考

案例一

public static void main(String[] args) {
    if(false == true){
        // \u000a     \u007d        \u007b
        //  换行符  大括号右半部 }    大括号左半部 {
        System.out.println("false为真了!!!");
    }
}
==================================
// 输出结果:false为真
// 代码型如  System.out.println("false为真了!!!");

案例二

字符混淆

public static void main(String[] args) {
    // \u0022为双引号半边"
    System.out.println("a\u0022.length()+\u0022b".length());
}
==================================
// 输出结果:2
// 代码型如:System.out.println("a".length() + "b".length());

总结

UniCode在开发中可以统一编码,但我们操作的时候一定需要注意特殊字符的转换,一旦不小心在注释中加了特殊UniCode字符,就有可能导致业务错乱,这样就相当于在代码里面下毒了,相当于给自己埋坑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个问题可能是由于LaTeX中的中英文字符宽度不同所导致的。中文字符的宽度通常比英文字符宽,因此在排版时需要特别注意。 解决这个问题的方法有两种: 1. 使用专门的中文排版工具,例如XeLaTeX或LuaLaTeX,这些工具支持Unicode编码,可以直接输入中文字符,而无需进行编码转换。使用这些工具可以方便地处理中英文混排的问题。 2. 在排版时使用专门的宏包,例如CJK宏包或xeCJK宏包,这些宏包提供了中文字符的支持,可以方便地进行中英文混排。在使用这些宏包时,需要在文档的导言部分进行设置,例如: ``` \usepackage{CJKutf8} % 使用CJKutf8宏包 \begin{CJK*}{UTF8}{gbsn} % 设置中文字体为宋体 中文内容 \end{CJK*} ``` 或者 ``` \usepackage{xeCJK} % 使用xeCJK宏包 \setCJKmainfont{SimSun} % 设置中文字体为宋体 中文内容 ``` 在使用这些宏包时,需要注意的是,中英文之间需要添加空格,否则可能会出现排版问题。 另外,对于图表的长度和位置,可以使用LaTeX提供的浮动体机制来控制。例如,使用`figure`环境来插入图片,使用`table`环境来插入表格。在这些环境中,可以使用`\caption`命令来添加图表标题,使用`\label`命令来设定引用标签。LaTeX会自动根据排版情况来调整图表的位置和大小。例如: ``` \begin{figure}[htbp] \centering \includegraphics{figure.pdf} \caption{这是一张图片} \label{fig:example} \end{figure} \begin{table}[htbp] \centering \caption{这是一个表格} \label{tab:example} \begin{tabular}{ccc} \hline 列1 & 列2 & 列3 \\ \hline 1 & 2 & 3 \\ 4 & 5 & 6 \\ \hline \end{tabular} \end{table} ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值