如何将const(uint)*转换为D语言字符类型wchar[]/wstring
解决D语言中bindbc-sfml的const(uint)*剪贴板文本转wchar[]/wstring的问题
首先明确:const(uint)*指向的是以uint(0)为终止符的Unicode码点数组,每个uint对应一个UTF-32编码的Unicode码点。你之前的代码只取了指针指向的第一个元素(*ct),所以只能得到第一个字符,需要遍历整个数组直到遇到终止符,再把码点序列转成D的UTF-16格式(wchar[]/wstring)。
完整转换步骤
- 将
const(uint)*转换为uint切片:遍历指针直到遇到uint(0),构造出完整的码点序列切片。 - 将UTF-32码点序列转成UTF-16的wchar数组:使用D标准库的
std.utf.toUTF16函数处理码点序列,自动处理需要多wchar表示的Unicode码点(如表情符号、辅助平面字符)。
代码示例
import std.utf; import std.range; import std.array; // 获取剪贴板的UTF-32码点指针 const(uint)* ct = cfClipboard_getUnicodeString(); // 1. 构造uint切片:从指针开始,取到第一个uint(0)为止 auto codePoints = ct.takeWhile!(c => c != 0).array; // 2. 转换为wstring(UTF-16) wstring ws = toUTF16!(wstring)(codePoints); // 测试输出 writeln(ws); // 复制的"Hello"会输出完整的Hello
简化写法
如果不需要保留中间的码点数组,可以直接链式调用:
import std.utf; import std.range; import std.array; const(uint)* ct = cfClipboard_getUnicodeString(); wstring ws = ct.takeWhile!(c => c != 0).array.toUTF16!(wstring); writeln(ws);
为什么你的之前尝试只返回第一个字符
to!wstring(*ct):*ct是单个uint值(比如'H'的码点72),to!wstring会把这个数值转成字符串,所以输出"72"。cast(wstring)[*ct]:把单个uint码点转成wchar(D中wchar是UTF-16,对于BMP内的码点可以直接cast),所以得到单个wchar的数组,也就是第一个字符。
内容的提问来源于stack exchange,提问作者vexaiv
相关产品推荐
相关产品推荐

