计算WCHAR字符串中的字符数

时间:2016-06-26 14:29:24

标签: c winapi unicode lua

Lua有一个名为paste(strsplit(as.character(df$info)[1],"[.] ")[[1]], collapse =". <br>") 的函数,它在utf8.len()上运行,并根据文档执行以下操作:

  

返回字符串s中的UTF-8字符数   https://www.lua.org/manual/5.3/manual.html#6.5

我正在使用与Win32 API接口的自定义Lua版本。每当我需要将UTF-8字符串传递到我的应用程序的Win32后端时,我使用const char *将其从UTF-8转换为WCHAR

现在我正在寻找一个与Lua的MultiByteToWideChar()函数完全完全的函数,但是使用UTF-16 utf8.len()字符串而不是UTF-8 { {1}}字符串。请不要问我任何Unicode错综复杂和术语讨论。我已经被告知,在讨论Unicode时,术语字符非常模糊,但Lua文档正好使用了这个术语(见上文)。所以我想要的是一个与Lua的WCHAR*完全相同的函数,但是在const char*而不是utf8.len()上运行...无论Lua作者实际上是什么意思字符。我只想拥有一个函数,它给我与WCHAR*完全相同的计数,但是对由const char *的UTF-8字符串生成的UTF-16 utf8.len()字符串进行操作。

我希望这个问题现在终于足够明确了......

最后一点:如果可能,我想避免使用像ICU这样的外部库。首选Win32 API解决方案。

1 个答案:

答案 0 :(得分:1)

查看the Lua utf8 source codeutf8.len()只计算代码点的数量,因此(例如)组合字符将单独计算。 wcslen()是最佳选择。

但是,您应注意,如果字符串包含BMP之外的字符(例如U + 10000或更高;表情符号),则wcslen()无法返回与{{1}相同的内容}。这是因为UTF-16无法使用单个代码点来表示这些;相反,它必须将代码点分成两个组合的特殊代码点,称为代理对。如果您需要将代理对视为单个代码点,则您必须自己编写该长度循环。