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

时间:2015-11-09 21:10:30

标签: 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上看到问题

1 个答案:

答案 0 :(得分:6)

  

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

根据Wikipedia article on UTF-8(强调补充):

  

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

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