文件大小(以字节为单位)不等于UTF-8编码文件中的字符数

0 common-lisp hunchentoot

我尝试常见的lisp hunchentoot-test.

当我上传带有非拉丁符号的utf-8文本文件时,上传文件的长度增加了.在完成文件中,插入了每个非拉丁符号的附加字节.我不明白为什么.最近的实验是刚刚在digitalocean上启动ubuntu系统.安装emacs,clisp和slime.在swank执行:

(ql:quickload"hunchentoot")
(ql:quickload"hunchentoot-test")
(hunchentoot:start(make-instance'hunchentoot:easy-acceptor:port 4242))

在127.0.0.1:4242/hunchentoot/test/upload.html上查看问题就足够了

Jos*_*lor 6

当我上传带有非拉丁符号的utf-8文本文件时,上传文件的长度增加了.在完成文件中,插入了每个非拉丁符号的附加字节.我不明白为什么.

根据维基百科关于UTF-8的文章(重点补充):

UTF-8是一种字符编码,能够以Unicode编码所有可能的字符或代码点.编码是可变长度的,使用8位代码单元.... UTF-8 使用一到四个8位字节对Unicode代码空间中的1,112,064个有效代码点(1,114,112个代码点减去2,048个代理代码点)中的每一个进行编码(一组8位在Unicode标准中称为八位字节).具有较低数值的代码点(即,Unicode字符集中的较早代码位置,其倾向于更频繁地出现)使用较少的字节进行编码.Unicode的前128个字符与ASCII一对一对应,使用与ASCII具有相同二进制值的单个八位字节进行编码,使有效的ASCII文本也是有效的UTF-8编码的Unicode.

这意味着当您将自己限制为ASCII文本时,每个字符将使用一个字节.但是,一旦离开ASCII域,每个字符可能使用多个字节.所以,即使你只添加一个字符,你也要添加多个字节.使用UTF-8,您不能假设"每个字符一个字节".