unicode编码与utf-8 区别

来源:未知作者:数据库 日期:2019/12/25 17:48 浏览:

主题材料再次出现:

  • unicode编码与utf-8 区别

1、PG客户端:

倘假如为着跨平台宽容性,只须求精通,在 Windows 记事本的语境中:

postgres=# create table text_test (id int,info text);CREATE TABLEpostgres=# insert into text_test values (1,E'/0x00');ERROR: invalid byte sequence for encoding "UTF8": 0x00
  • 所谓的「ANSI」指的是对应当前系统 locale 的残留(legacy)编码。[1]
  • 所谓的「Unicode」指的是含有 BOM 的小端序 UTF-16。[2]
  • 所谓的「UTF-8」指的是带 BOM 的 UTF-8。[3]

2、SQL Server发生多少

举二个事例:It's 果壳网晚报

create table test_varchar(id int,name varchar(20));insert into test_varchar values (1, 'name' + char(0));insert into test_varchar values (1, 'name' + '');

您见到的unicode字符集是那样的编码表:

然后经过java程序开展获取数据并插入到PG,相像会获得错误消息:

I 0049
t 0074
' 0027
s 0073
  0020
知 77e5
乎 4e4e
日 65e5
报 62a5
invalid byte sequence for encoding "UTF8": 0x00

每多个字符对应贰个十八进制数字。

第后生可畏大家以为此为gb2312转变到UTF8时,发生了无法转正的错误。经查UTF8是变长的, 1-6个字节。他的编码法则如下:

Computer只懂二进制,因而,严苛根据unicode的措施(UCS-2卡塔尔,应该那样存款和储蓄:

Bits Last code point Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6 7 U+007F 0xxxxxxx 11 U+07FF 110xxxxx 10xxxxxx 16 U+FFFF 1110xxxx 10xxxxxx 10xxxxxx 21 U+1FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 26 U+3FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 31 U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

I 00000000 01001001
t 00000000 01110100
' 00000000 00100111
s 00000000 01110011
  00000000 00100000
知 01110111 11100101
乎 01001110 01001110
日 01100101 11100101
报 01100010 10100101

而0x00是适合UTF8法规的。那就使大家充足讶异。然后大家发现成两点进而确认了难点:1、

本条字符串总共占用了贰十二个字节,不过相比中斯拉维尼亚语的二进制码,能够开掘,克罗地亚语前9位都以0!浪费啊,浪费硬盘,浪费流量。

PostgreSQL doesn't support storing NULL (/0x00) characters in text fields (this is obviously different from the database NULL value, which is fully supported).If you need to store the NULL character, you must use a bytea field - which should store anything you want, but won't support text operations on it.Given that PostgreSQL doesn't support it in text values, there's no good way to get it to remove it. You could import your data into bytea and later convert it to text using a special function (in perl or something, maybe), but it's likely going to be easier to do that in preprocessing before you load it.Source:

怎么办?

2、

UTF。

Terminating character

UTF-8是这么做的:

Indicated by

1. 单字节的字符,字节的首先位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相似;

Tab

2. n个字节的字符(n>1卡塔尔,第多少个字节的前n位设为1,第n+1位设为0,后边字节的前两位都设为10,那n个字节的别的空位填充该字符unicode码,高位用0补足。

/t

那般就产生了如下的UTF-8标志位:

This is the default field terminator.

0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
... ...

Newline character

于是,”It's 和讯晚报“就改为了:

/n

I 01001001
t 01110100
' 00100111
s 01110011
  00100000
知 11100111 10011111 10100101
乎 11100100 10111001 10001110
日 11100110 10010111 10100101
报 11100110 10001010 10100101

This is the default row terminator.

和上边的方案比较一下,菲律宾语短了,每个普通话字符却多用了五个字节。可是全数字符串只用了十五个字节,比上边的十多个短了一小点。

Carriage return/line feed

上面是课后学业:

/r

请将”It's 网易晚报“的GB2312和GBK码(自行google卡塔尔转成二进制。不思谋历史因素,从手艺角度解释为什么在unicode和UTF-8大行其道的还要,GB2312和GBK仍在广泛利用。

Backslash1

剧透:一切皆认为了节省你的硬盘和流量。