zoukankan      html  css  js  c++  java
  • java----编码问题

        public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
            char c = 0x61;
            System.out.println(c);
            String x = "u6c34u6c34"; //16**4
            char y = 'u6c34';
            System.out.println(x);
            System.out.println(y);
        }
    

    Unicode字符集和UTF-8编码方式

    Unicode符号范围        |   UTF-8编码方式
    
    (十六进制)             | (二进制)       #Unicode部分为16进制编码, UTF-8编码为2进制
    
    —————————————————————–————————————–
    0000-0000 007F   | 0xxxxxxx      #UTF-8规定,若1字符=1字节,首位须为‘0’
    0080-0000 07FF   | 110xxxxx 10xxxxxx  #UTF-8规定,若1字符=2字节,高位字节前3位为‘110’,低位前2位为‘10’
    0800-0000 FFFF   | 1110xxxx 10xxxxxx 10xxxxxx  #UTF-8规定,若1字符=3字节,高位字节前3位为‘110’,后面低位前2位一律为‘10’。(占4,5字节字符规则以此类推)
    作者:于洋 链接:https://www.zhihu.com/question/23374078/answer/69732605 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    参考:https://www.cnblogs.com/deepblue775737449/p/7604738.html

       https://www.zhihu.com/question/23374078/answer/69732605  :写的非常好

    有趣的GBK和UTF8起源:在文本中输入“联通”二字,再次打开会乱码,原因所在

    当你在windows的记事本里新建一个文件,输入“联通”两个字之后,保存,关闭,然后再次打开,你会发现这两个字已经消失了,代之的是几个乱码!呵呵,有人说这就是联通之所以拼不过移动的原因。
      其实这是因为GB2312编码与UTF8编码产生了编码冲撞的原因。
      从网上引来一段从UNICODE到UTF8的转换规则:

    |-------------|-----------------------------|
    |Unicode | UTF-8 |
    |-------------|-----------------------------|
    |0000 – 007F| 0xxxxxxx |
    |0080 - 07FF| 110xxxxx 10xxxxxx |
    |0800 – FFFF| 1110xxxx 10xxxxxx 10xxxxxx |
    |-------------|-----------------------------|

      例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 1100 0100 1001,将这个比特流按三字节模板的分段方法分为0110 110001 001001,依次代替模板中的x,得到:1110-0110 10-110001 10-001001,即E6 B1 89,这就是其UTF8的编码。
      而当你新建一个文本文件时,记事本的编码默认是ANSI, 如果你在ANSI的编码输入汉字,那么他实际就是GB系列的编码方式,在这种编码下,“联想”的内码是:
      c1 1100 0001
      aa 1010 1010
      cd 1100 1101
      a8 1010 1000
      注意到了吗?第一二个字节、第三四个字节的起始部分的都是“110”和“10”,正好与UTF8规则里的两字节模板是一致的,于是再次打开记事本时,记事本就误认为这是一个UTF8编码的文件,让我们把第一个字节的110和第二个字节的10去掉,我们就得到了“00001 101010”,再把各位对对齐,补上前导的0,就得到了“0000 0000 0110 1010”,不好意思,这是UNICODE的006A,也就是小写的字母“j”,而之后的两字节用UTF8解码之后是0368,这个字符什么也不是。这就是只有“联通”两个字的文件没有办法在记事本里正常显示的原因。
      而如果你在“联通”之后多输入几个字,其他的字的编码不见得又恰好是110和10开始的字节,这样再次打开时,记事本就不会坚持这是一个utf8编码的文件,而会用ANSI的方式解读之,这时乱码又不出现了。
      
      好了,终于可以回答NICO的问题了,在数据库里,有n前缀的字串类型就是UNICODE类型,这种类型中,固定用两个字节来表示一个字符,无论这个字符是汉字还是英文字母,或是别的什么。
      如果你要测试“abc汉字”这个串的长度,在没有n前缀的数据类型里,这个字串是7个字符的长度,因为一个汉字相当于两个字符。而在有n前缀的数据类型里,同样的测试串长度的函数将会告诉你是5个字符,因为一个汉字就是一个字符。

    参考:https://blog.csdn.net/qq_36688143/article/details/79496753

  • 相关阅读:
    SDUT 2128 树结构练习——排序二叉树的中序遍历
    SDUT 2137 数据结构实验之求二叉树后序遍历和层次遍历
    SDUT 3341 数据结构实验之二叉树二:遍历二叉树
    总结:串和数组的学习
    SDUT 3347 数据结构实验之数组三:快速转置
    SDUT 3348 数据结构实验之数组二:稀疏矩阵
    SDUT 1500 Message Flood
    SDUT 2463 学密码学一定得学程序
    SDUT 2125 数据结构实验之串二:字符串匹配
    mybatis学习(七)(choose的学习)
  • 原文地址:https://www.cnblogs.com/yanxiaoge/p/11586634.html
Copyright © 2011-2022 走看看