-
对接后台的一个接口,返回的数据中有一段类似于这种“北京丨海淀”,然后我只想要“北京”这个词
于是前端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码的方法有很多种
- 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
- 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'
¿
- Vim作为专门给程序员用的editor,用一个简单的操作符ga就可以了
i<C-v>u00bf 就可以打印出一个¿
将光标移动到特殊字符上<ESC>ga
<¿> 191, Hex 00bf, Octal 277
网友评论