Lua 编码 CodePage CP 936 Unicode 中文 UTF8 Native Code 库library 搜集
Posted robertl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua 编码 CodePage CP 936 Unicode 中文 UTF8 Native Code 库library 搜集相关的知识,希望对你有一定的参考价值。
不常用,查了又忘,遇到时又抓狂,记录下,疑问请留言。内容来自经验总结,盲人摸象,不系统,不正确。
Lua 5.3,Win 10,ZeroBrane Studio。
字符按码表被编码。
字符character(符号)与编码code(数值)的映射(编码)关系。
字符-编码->编码、编码-解码->字符。
映射关系体现为码表,可称为字符集。
字符在码表中的编码,被称为编码位置(简称码位,英文code point、code position)。
一个字符可以被多个码表描述,有多个编码方式。
Lua(5.3)中utf8编码下,有assert(‘·‘==‘194183‘ and ‘·‘==‘u{b7}‘)。
Windows系统中码表称为代码页。
CHCP命令可查看、设置系统代码页。
命令chcp.com位于C:WindowsSystem32chcp.com。
此路径被包含于PATH环境变量下,可在命令行CMD、Lua os.execute执行。
Unicode,一个具体的码表,包含所有字符及其编码,是字符集。
Lua文档/文件的编码可设置,此处为utf-8 (utf8)。
Lua文档/文件/代码中的字面字符(称为字面量、literal string)受Lua文件编码的影响(称为硬编码)。
如,字符"·"在utf8编码的文件中编码值(编码)为194,183,在CP936编码的文件中编码值为161,164。
Lua中可在字面量字符串中嵌入字节(byte)编码,形如"xXX"(十六进制)或"ddd"(十进制)。
则,在utf8编码的文件中,有assert("·"=="194183");在CP936编码的文件中,有assert("·"=="161164")。
Lua中可在字符串中嵌入utf8二次编码的Unicode编码(见后),形如"u{XXX}"。
参见3.1 – Lexical Conventions:The UTF-8 encoding of a Unicode character can be inserted in a literal string。
以上嵌入的编码不受Lua文件编码的影响。
代码页(CodePage/CP)一个个具体的码表,各自包含一定范围的字符及其编码,是字符集。
包含一定范围的字符即包含所有字符的Unicode的子集。
代码页中的字符是Unicode的子集,但其编码不一定与Unicode编码相同。
如中文子集,包含中文环境涉及的字符,英文字符、中文字符等,其中英文字符的代码页编码或与Unicode编码一致。
代码页描述的字符范围较Unicode小,进而,存储空间小、编码/解码时间短。
叫做代码页,是因为定义的各代码页字符集是按数字编号的。CP1、CP2、..CP936..、CP65000、CP65001。
CP0为系统/环境代码页,CP65001为UTF-8(参见如下utf-8)。
GB2312/GBK是不同版本的国标码表。
GBK版本更高,兼容GB2312。
GBK被Unicode采纳收录到CP936。
其他不常见的中文码表CP54936 (GB 18030)。
utf-8是压缩/再编码/重编码/二次编码/转换方法。
把固定长度的某编码转换为一个或多个8位二进制单元的变长度编码。
编码与utf8可以互相转换。
codepoint_to_utf8(codepoint)、utf8_to_codepoint(string,index),unicode库里接口函数名为unicode.encode、unicode.decode。
utf8_to_unicode(srcstr)、unicode_to_utf8(srcstr)。
codepoint为环境下的编码?(或严格为Unicode编码?)
以上的CP65001即对Unicode编码进行的utf8二次编码。
通常默认的utf8即面向Unicode的CP65001。也可转换其他编码?
codepoint_to_utf8‘·‘报错‘out of range‘?CP936不能转utf8?
没弄懂,怀疑是本地环境同为CP936的原因。
相关搜索:
PHP开发中编码问题探讨_迹忆博客(UTF-8被误判为CP936)
php cp936转utf8编码转换乱码问题的解决方案_南通SEO-CSDN博客(作为latin1//IGNORE再转UTF8)
诡异的 CP936 编码无法转换成 UTF-8 - V2EX(不要看print的结果,看原始HEX)
string.byte (char,1,#char)可以获得字符char的编码。
string.byte (s [, i [, j]]): Returns the internal numeric codes of the characters s[i], s[i+1], ..., s[j].
internal numeric codes即字符的编码。
如utf8编码的lua文件中的字符"·",string.byte (‘·‘,1,#‘·‘)得194183;CP936编码的此字符,得161,164。
string.char(byte,..)
为前一操作的逆操作,将编码解码为字符。
如string.char(194,183)所得字符在utf8下为"·",在其他编码下无意义。
print(...)
能接受uft8或系统代码页编码的字符串输入,并正确输出。貌似会自动/隐式地识别处理utf8编码。
print‘194183‘(utf8)、print‘161164‘(CP936)均输出"·"。
故,不可用其检查编码。
ZeroBrane Studio(ZBS)调试中,会按文件编码(此处为utf8)显式字符串。
如,‘194183‘显式为"·",‘161164‘显式为‘161164‘。
CP936、UTF8、Unicode
UTF8与Unicode可以靠算法相互转换。UTF8可以看作Unicode的压缩形式。
CP936与Unicode是不同的码表,需要查表转换。
如Unicode.org-CP936描述了CP936编码与Unicode编码,及Unicode字符名的对应关系。
不同编码值有各自的特征,可以通过扫描字符串推断出可能的编码方式(或称为码表、字符集)。
如utf8.validate(str, byte_pos)可以验证字符串是否为utf8编码。
部分Lua函数、库不支持utf8。
如io.open、io.popen、lfs.attributes、lfs.dir的输入字符串需为活动代码页(CP936),不支持传入/输入utf8编码的中文文件路径;
同时如lfs.dir的输出为活动代码页(CP936)。
相关库
perfgao/lua-resty-unicode - 码云 - 开源中国
unicode.encode‘·‘--u00b7
unicode.decode‘\u00b7‘--"·"
utf8.lua · Github,扩展lua字符串库,使支持utf8,纯Lua实现。
Egor-Skriptunoff/utf8_filenames.lua · Github
扩展Lua标准库,使支持utf8编码输入。核心是其中的convert_from_utf8,可以提取用于扩展lfs。
其他参考链接:
以上是关于Lua 编码 CodePage CP 936 Unicode 中文 UTF8 Native Code 库library 搜集的主要内容,如果未能解决你的问题,请参考以下文章