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解决方案。
答案 0 :(得分:1)
查看the Lua utf8
source code,utf8.len()
只计算代码点的数量,因此(例如)组合字符将单独计算。 wcslen()
是最佳选择。
但是,您应注意,如果字符串包含BMP之外的字符(例如U + 10000或更高;表情符号),则wcslen()
无法返回与{{1}相同的内容}。这是因为UTF-16无法使用单个代码点来表示这些;相反,它必须将代码点分成两个组合的特殊代码点,称为代理对。如果您需要将代理对视为单个代码点,则您必须自己编写该长度循环。