计算 WCHAR 字符串中的字符数

标签 c winapi unicode lua

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/

相关文章:

c - 在 C 运行时生成嵌套循环

.net - 诊断 "Quota Exceeded"Win32Exception

c++ - NT 文件系统上非常小的文件上的 FSCTL_GET_RETRIEVAL_POINTERS 失败

json - 从 Swift 中的 HTTPCookie 读取 JSON 错误不起作用

java - 如何转义 Unicode 退格字符。在 Java 中用于 tomcat 日志

php - 无法从数据库中获取要显示的正确字符

c - 如何获取存储为字符的字符串的长度

c - 在 C 2.0 统计错误中读取目录

c - 如何将一棵简单的树写入文件并读回?

java - 命令行 "java -version"会将结果发送到 stdOut 或 stdErr?