得到一个特殊字符的Unicode码

  • 对接后台的一个接口,返回的数据中有一段类似于这种“北京丨海淀”,然后我只想要“北京”这个词
    于是前端js随手写下'北京丨海淀'.split('|')[0],结果没取到
    当时愣了下,不过没在意,换另外一个方法继续试,还是不行,这个时候就有点懵逼了
    于是再换方法继续试,把所有的方法全都试了一遍全都不行,这个时候就有点慌了,局面好像有点控制不住了
    把所有的原因都考虑了一遍,甚至换了浏览器和电脑,试了很长时间都不行
    最后终于将目光放到了“丨”这个字符上,复制粘贴然后打印其unicode编码
    发现这个东西根本不是英文编码状态下的竖线|,而是一个拼音为gun的汉字丨
    找出了原因后,当时心情很平静,只不过是有点想把负责此接口的后端拖出来砍两刀而已
    ( ・_・)ノ⌒●~*
    链接:https://www.zhihu.com/question/21747929/answer/319675621

  • 那么如何得到一个特殊字符的Unicode码呢?例如¿的Unicode是00bf

  • 首先要了解Unicode和uft-8,utf-16的关系,明确Unicode是字符集,utf-8是编码方式,这个问题中一encode就错了
    参考链接:https://www.zhihu.com/question/23374078
    简单来说:
    Unicode 是「字符集」
    UTF-8 是「编码规则」
    其中:
    字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)
    编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)
    广义的 Unicode 是一个标准,定义了一个字符集以及一系列的编码规则,即 Unicode 字符集和 UTF-8、UTF-16、UTF-32 等等编码……
    Unicode 字符集为每一个字符分配一个码位,例如「知」的码位是 30693,记作 U+77E5(30693 的十六进制为 0x77E5)。
    UTF-8 顾名思义,是一套以 8 位为一个编码单位的可变长编码。会将一个码位编码为 1 到 4 个字节:
    U+ 0000 ~ U+ 007F: 0XXXXXXX
    U+ 0080 ~ U+ 07FF: 110XXXXX 10XXXXXX
    U+ 0800 ~ U+ FFFF: 1110XXXX 10XXXXXX 10XXXXXX
    U+10000 ~ U+1FFFF: 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
    根据上表中的编码规则,之前的「知」字的码位 U+77E5 属于第三行的范围:
    7 7 E 5
    0111 0111 1110 0101 二进制的 77E5
    0111 011111 100101 二进制的 77E5
    1110XXXX 10XXXXXX 10XXXXXX 模版(上表第三行)
    11100111 10011111 10100101 代入模版
    E 7 9 F A 5
    这就是将 U+77E5 按照 UTF-8 编码为字节序列 E79FA5 的过程。反之亦然。

  • 得到一个特殊字符的Unicode码的方法有很多种

  1. Java中char的编码方式本来就是Unicode,占两个字节
public class Test
{
    public static void main(String[] args) throws Exception
    {
        int s='¿';
        System.out.println(Integer.toHexString(s));
    }
}
[root@shuffle-dev py_test]$ java Test
bf
  1. Python2中用u来指定Unicode字符串
#!/usr/bin/env python
# -*- coding: utf-8 -*-

s=u'¿'
print s.__repr__()
print s
[root@shuffle-dev py_test]$ python test.py
u'\xbf'
¿
  1. Vim作为专门给程序员用的editor,用一个简单的操作符ga就可以了
iu00bf 就可以打印出一个¿
将光标移动到特殊字符上ga
<¿> 191, Hex 00bf, Octal 277

你可能感兴趣的:(得到一个特殊字符的Unicode码)