Python 字符编码
2015-08-25
突然来了兴致,想看看 Unicode 中有多少个中文,查了一下,很多人都是说 4e00 至 9fff 段。
# -*- coding: utf-8 -*-
all_chinese_in_unicode = range(0x4e00, 0x9fff)
def transfer(u_char_num):
if isinstance(u_char_num, int):
u_char_hex = '%x' % u_char_num
u_char_str = '\u' + u_char_hex
else:
if isinstance(u_char_num, str) and len(u_char_num) == 4:
u_char_str = '\u' + u_char_num
else:
raise Exception
u_char = u_char_str.decode('raw_unicode_escape')
# print u_char_hex, u_char
return u_char
def test_transfer():
# repr(u"国") -> u'\u56fd' -> 22269
print transfer(0x56fd)
# 打印所有中文字符
# for i in all_chinese_in_unicode:
# print transfer(i),
# print
# 打印最后一个中文字符及前、后各一个字符
last_chinese_char = 0x9fbb
last_chinese_char_index = all_chinese_in_unicode.index(last_chinese_char)
start, end = last_chinese_char_index - 1, last_chinese_char_index + 2
for i in all_chinese_in_unicode[start:end]:
print transfer(i),
print
Ubuntu 下的 zsh 中运行,只能显示到这个字符:龻,后面的都是乱码,这个字符对应的十六进制数是 9fbb
。
结果又意外发现,最后一个字符似乎不是 9fbb,而是 9fcc(改 URL 一个一个试出来的)。
来源:https://www.fileformat.info/info/unicode/char/9fcc/index.htm
对应文字图片:https://www.fileformat.info/info/unicode/char/9fcc/sample.png
当然,这个来源并不保证权威,也可能有错误,涉及中文字符的范围还是使用 4e00 - 9fff 比较保险。
比如正则表达式:[\u4e00-\u9fff]
。
标点符号
看来是需要抽半天空闲时间,仔细研究研究编码问题了。
参考
DB MySQL 字符编码
2015-05-11
各种类型的编码
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
5.7 及更早版本默认字符集和 Collation 是 latin1 和 latin1_swedish_ci
8.0 之后改成 utf8mb4 和 utf8mb4_0900_ai_ci
上面就有 6 种 全局的编码:
- client 客户端编码
- connection 连接编码
- database 数据库编码,创建表时的默认编码
load data, 以及创建
- filesystem 文件系统编码
- results 结果编码
- server 服务端编码,创建数据库时的默认编码
- system 系统编码
还有两种局部的编码:表的编码和列(字段)的编码。
列主要是 char, varchar, text 类型。
字符集
# 都可以 LIKE 搜索
SHOW CHARACTER SET;
SHOW CHARSET;
SHOW CHAR SET;
Charset |
Description |
Default collation |
Maxlen |
armscii8 |
ARMSCII-8 Armenian |
armscii8_general_ci |
1 |
ascii |
US ASCII |
ascii_general_ci |
1 |
big5 |
Big5 Traditional Chinese |
big5_chinese_ci |
2 |
binary |
Binary pseudo charset |
binary |
1 |
cp1250 |
Windows Central European |
cp1250_general_ci |
1 |
cp1251 |
Windows Cyrillic |
cp1251_general_ci |
1 |
cp1256 |
Windows Arabic |
cp1256_general_ci |
1 |
cp1257 |
Windows Baltic |
cp1257_general_ci |
1 |
cp850 |
DOS West European |
cp850_general_ci |
1 |
cp852 |
DOS Central European |
cp852_general_ci |
1 |
cp866 |
DOS Russian |
cp866_general_ci |
1 |
cp932 |
SJIS for Windows Japanese |
cp932_japanese_ci |
2 |
dec8 |
DEC West European |
dec8_swedish_ci |
1 |
eucjpms |
UJIS for Windows Japanese |
eucjpms_japanese_ci |
3 |
euckr |
EUC-KR Korean |
euckr_korean_ci |
2 |
gb18030 |
China National Standard GB18030 |
gb18030_chinese_ci |
4 |
gb2312 |
GB2312 Simplified Chinese |
gb2312_chinese_ci |
2 |
gbk |
GBK Simplified Chinese |
gbk_chinese_ci |
2 |
geostd8 |
GEOSTD8 Georgian |
geostd8_general_ci |
1 |
greek |
ISO 8859-7 Greek |
greek_general_ci |
1 |
hebrew |
ISO 8859-8 Hebrew |
hebrew_general_ci |
1 |
hp8 |
HP West European |
hp8_english_ci |
1 |
keybcs2 |
DOS Kamenicky Czech-Slovak |
keybcs2_general_ci |
1 |
koi8r |
KOI8-R Relcom Russian |
koi8r_general_ci |
1 |
koi8u |
KOI8-U Ukrainian |
koi8u_general_ci |
1 |
latin1 |
cp1252 West European |
latin1_swedish_ci |
1 |
latin2 |
ISO 8859-2 Central European |
latin2_general_ci |
1 |
latin5 |
ISO 8859-9 Turkish |
latin5_turkish_ci |
1 |
latin7 |
ISO 8859-13 Baltic |
latin7_general_ci |
1 |
macce |
Mac Central European |
macce_general_ci |
1 |
macroman |
Mac West European |
macroman_general_ci |
1 |
sjis |
Shift-JIS Japanese |
sjis_japanese_ci |
2 |
swe7 |
7bit Swedish |
swe7_swedish_ci |
1 |
tis620 |
TIS620 Thai |
tis620_thai_ci |
1 |
ucs2 |
UCS-2 Unicode |
ucs2_general_ci |
2 |
ujis |
EUC-JP Japanese |
ujis_japanese_ci |
3 |
utf16 |
UTF-16 Unicode |
utf16_general_ci |
4 |
utf16le |
UTF-16LE Unicode |
utf16le_general_ci |
4 |
utf32 |
UTF-32 Unicode |
utf32_general_ci |
4 |
utf8mb3 |
UTF-8 Unicode |
utf8mb3_general_ci |
3 |
utf8mb4 |
UTF-8 Unicode |
utf8mb4_0900_ai_ci |
4 |
SELECT * FROM information_schema.character_sets;
SELECT * FROM information_schema.character_sets WHERE CHARACTER_SET_NAME LIKE "%utf%";
CHARACTER_SET_NAME |
DEFAULT_COLLATE_NAME |
DESCRIPTION |
MAXLEN |
utf8mb3 |
utf8mb3_general_ci |
UTF-8 Unicode |
3 |
utf16 |
utf16_general_ci |
UTF-16 Unicode |
4 |
utf16le |
utf16le_general_ci |
UTF-16LE Unicode |
4 |
utf32 |
utf32_general_ci |
UTF-32 Unicode |
4 |
utf8mb4 |
utf8mb4_0900_ai_ci |
UTF-8 Unicode |
4 |
排序规则
SHOW COLLATION;
这就多了,两百多。
SHOW COLLATION LIKE "%ascii%";
Collation |
Charset |
Id |
Default |
Compiled |
Sortlen |
Pad_attribute |
ascii_bin |
ascii |
65 |
|
Yes |
1 |
PAD SPACE |
ascii_general_ci |
ascii |
11 |
Yes |
Yes |
1 |
PAD SPACE |
SELECT * FROM information_schema.collations WHERE CHARACTER_SET_NAME = "utf8mb4" AND COLLATION_NAME LIKE "%zh%";
COLLATION_NAME |
CHARACTER_SET_NAME |
ID |
IS_DEFAULT |
IS_COMPILED |
SORTLEN |
PAD_ATTRIBUTE |
utf8mb4_zh_0900_as_cs |
utf8mb4 |
308 |
|
Yes |
0 |
NO PAD |
命名规则
字符集名称,语言,通用后缀
ai
Accent-insensitive 重音不敏感
as
Accent-sensitive 重音敏感
ci
Case-insensitive 大小写不敏感
cs
Case-sensitive 大小写敏感
ks
Kana-sensitive 假名敏感(日语)
bin
二进制
8.0 之后,很多编码中多了 0900 字样,表示 Unicode 9.0 规范。
参考资料与拓展阅读
WebDev 字符编码
2013-02-02
Content-Type: text/html; charset=ISO-8859-4
HTTP 头部
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- HTML5:
<meta charset="utf-8">
<?xml version="1.0" encoding="ISO-8859-1"?>
XHTML 可以才用 XML 声明来定义编码