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 pointcode 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.encodeunicode.decode

utf8_to_unicode(srcstr)unicode_to_utf8(srcstr)

参见github pure lua 库1库2

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.openio.popenlfs.attributeslfs.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。

其他参考链接:

utf-8 和 cp936的区别

以上是关于Lua 编码 CodePage CP 936 Unicode 中文 UTF8 Native Code 库library 搜集的主要内容,如果未能解决你的问题,请参考以下文章

cmd中的chcp437怎么都改不成936

前端格式

ue怎样改变字符编码

CP936实际上是GBK,编码问题再次让我熬夜

codepage 和 charset

字符集编码cp936ANSIUNICODEUTF-8GB2312GBKGB18030DBCSUCS