将ASCII字符串转换为Unicode? Windows,纯C

时间:2012-07-20 09:44:05

标签: c windows unicode ascii

对于许多编程语言,我找到了这个问题的答案,除了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

6 个答案:

答案 0 :(得分:10)

MultiByteToWideChar

#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)

您应该查看MultiByteToWideChar function

答案 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;
}