5

我已经使用 Windows API 找到了许多编程语言(C 除外)的这个问题的答案。请不要 C++ 答案。考虑以下:

#include <windows.h>
char *string = "The quick brown fox jumps over the lazy dog";
WCHAR unistring[strlen(string)+1];

我可以使用什么函数来用string中的字符填充unistring

4

6 回答 6

12

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);
于 2012-07-20T09:48:24.813 回答
2

您应该查看MultiByteToWideChar 函数

于 2012-07-20T09:48:57.000 回答
2

如果你对 Unicode 很认真,你应该参考International Components for Unicode,这是一个跨平台的解决方案,用于处理 C 或 C++ 中的 Unicode 转换和存储。

WCHAR例如,您的Unicode 一开始就不是wchar_tUnicode,因为 Microsoft 有点过早地将其定义为 16 位(UCS-2),并且当 Unicode 变为 32 位时陷入了向后兼容性的地狱:UCS-2几乎是 UTF ,但与 UTF并不完全相同-16,后者实际上是多字节编码,就像 UTF-8 一样。Unicode 中的“宽”格式意味着 32 位 (UTF-32),即使这样,代码点(即 32 位值)和抽象字符(即可打印字形)之间也没有 1:1 的关系。

无偿的,失去关联的链接列表:

于 2012-07-20T09:50:44.060 回答
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];
于 2020-08-25T16:13:19.460 回答
0

您可以使用mbstowcs将“多字节”转换为宽字符串。

于 2012-07-20T09:48:35.373 回答
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;
}
于 2018-03-30T16:11:20.110 回答