Lua 有一个名为 utf8.len()
的函数,它对 const char *
进行操作,并根据文档执行以下操作:
Returns the number of UTF-8 characters in string s https://www.lua.org/manual/5.3/manual.html#6.5
我正在使用与 Win32 API 交互的 Lua 定制版本。每当我需要将 UTF-8 字符串传递到应用程序的 Win32 后端时,我都会使用 MultiByteToWideChar()
将其从 UTF-8 转换为 WCHAR
。
现在我正在寻找一个与 Lua 的 utf8.len()
函数完全一样的函数,但采用 UTF-16 WCHAR*
字符串而不是 UTF-8 const char*
字符串。请不要向我询问任何 Unicode 的复杂性和术语讨论。我已经被告知,术语字符在谈论 Unicode 时非常含糊,但 Lua 文档恰恰使用了这个术语(见上文)。所以我想要的是一个与 Lua 的 utf8.len()
完全相同的函数,但在 WCHAR*
而不是 const char *
上运行code> ...不管 Lua 作者所说的字符实际上是什么意思。我只想有一个函数,它可以提供与 utf8.len() 完全相同的计数,但对从 UTF-8 生成的 UTF-16 WCHAR*
字符串进行操作由 MultiByteToWideChar()
生成的字符串。
我希望问题现在终于足够清楚了......
最后一点:如果可能的话,我想避免使用 ICU 等外部库。 Win32 API 解决方案是首选。
最佳答案
查看the Lua utf8
source code , utf8.len()
仅计算代码点的数量,因此(例如)组合字符将单独计算。那么 wcslen()
就是正确的选择。
但是,您应该注意,如果字符串包含 BMP 之外的字符(U+10000 或更高;例如表情符号),则 wcslen()
无法返回与 utf8.len()
。这是因为 UTF-16 无法使用单个代码点来表示这些;相反,它必须将代码点分解为两个特殊的代码点,这两个代码点组合起来称为代理项对。如果您需要将代理对视为单个代码点,则必须自己编写该长度循环。
关于计算 WCHAR 字符串中的字符数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38039505/