对于许多编程语言,我找到了这个问题的答案,除了C,使用Windows API。请不要回答C ++。请考虑以下事项:
#include <windows.h>
char *string = "The quick brown fox jumps over the lazy dog";
WCHAR unistring[strlen(string)+1];
我可以用什么函数用 string 填充 unistring ?
答案 0 :(得分:10)
#include <windows.h>
char *string = "The quick brown fox jumps over the lazy dog";
size_t len = strlen(string);
WCHAR unistring[len + 1];
int result = MultiByteToWideChar(CP_OEMCP, 0, string, -1, unistring, len + 1);
答案 1 :(得分:2)
答案 2 :(得分:2)
如果你真的认真对待Unicode,你应该参考International Components for Unicode,这是一个跨平台的解决方案,用于处理C或C ++中的Unicode转换和存储。
例如,你的WCHAR
开始时不是 Unicode,因为微软有点过早地将wchar_t
定义为16位(UCS-2),并陷入困境当Unicode变为32位时向后兼容地狱:UCS-2 几乎,但完全与UTF-16完全相同,后者实际上是UTF-8的多字节编码。 &#34;宽&#34; Unicode中的格式表示32位(UTF-32),甚至你在代码点(即32位值)和抽象字符(即可打印的字符串)之间没有1:1的关系字形)。
Gratuituous,丢失相关的链接列表:
答案 3 :(得分:1)
如果您知道输入是纯ASCII且不涉及扩展字符集,则无需调用任何奇特的转换函数。所有ASCII中的字符代码在Unicode中都是相同的,因此您要做的就是从一个数组复制到另一个数组。
#include <windows.h>
char *string = "The quick brown fox jumps over the lazy dog";
int len = strlen(string);
WCHAR unistring[len+1];
int i;
for (i = 0; i <= len; ++i)
unistring[i] = string[i];
答案 4 :(得分:0)
您可以使用mbstowcs
将“多字节”转换为宽字符串。
答案 5 :(得分:0)
这是另一种方法。它不是那么直接,但是如果你不想按照一个非常特定的顺序输入6个参数,并且记住MultiByteToWideChar
的代码页编号/宏,它就能完成这项工作。在这台笔记本电脑上执行16微秒,其中大部分时间(9微秒)用于AddAtomW
。
作为参考,MultiByteToWideChar需要0到1微秒。
#include <Windows.h>
const wchar_t msg[] = L"We did it!";
int main(int argc, char **argv)
{
char result[(sizeof(msg) / 2) + 1];
ATOM tmp;
tmp = AddAtomW(msg);
GetAtomNameA(tmp, result, sizeof(result));
MessageBoxA(NULL ,result,"it says", MB_OK | MB_ICONINFORMATION);
DeleteAtom(tmp);
return 0;
}