unicond编码

来源:互联网 发布:通信协议和网络协议 编辑:程序博客网 时间:2024/05/16 05:40
美国佬语言由简单的符号和26个字母组成,这样,他们只需要一个字节就可以表达出所有了。
这是ascii码。
实际上很多很多国家的语言文字极其丰富,比如中文。用ascii码最多可以256个符号,远远不够!!!
如果有一种编码囊括世界上所有的语言文字就好了,这样世界上所有的符号都能用计算机表示,这就是unicode.
它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Unicode中:汉字“字”对应的数字是23383(十进制),十六进制表示为5B57。
在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32。
下面介绍介绍一种非常常用的编码方式。UTF-8,是一种针对Unicode的可变长度字符编码,又称万国码规则如下。
Unicode编码(十六进制) UTF-8 字节流(二进制)
000000 - 00007F        0xxxxxxx >=0
000080 - 0007FF        110xxxxx 10xxxxxx >=0xc0
000800 - 00FFFF        1110xxxx 10xxxxxx 10xxxxxx >=0xe0
010000 - 10FFFF        11110xxx 10xxxxxx 10xxxxxx 10xxxxxx >=0xf0
可以看出,如果某字符第一个字节第一位为0,那么这字符占一个字节,这时同ascii码。
如果第一位为1,那么连续的1个数即该字符占字节数。编码规则如上。
请看下面一段代码
local input = "你好World"
print(string.utf8len(input))
-- 输出 7
function string.utf8len(input)
    local len  = string.len(input)
    local left = len
    local cnt  = 0
    local arr  = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}
    while left ~= 0 do
        local tmp = string.byte(input, -left)--字符转对应的int
        local i   = #arr
        while arr[i] do
            if tmp >= arr[i] then
                left = left - i
                break
            end
            i = i - 1
        end
        cnt = cnt + 1
    end
    return cnt
end
特别注意的是,这段代码保存时一定确保为utf-8.
0 0
原创粉丝点击