Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ BSTR转换为UTF-8_C++_Windows_Utf 8 - Fatal编程技术网

C++ BSTR转换为UTF-8

C++ BSTR转换为UTF-8,c++,windows,utf-8,C++,Windows,Utf 8,我正在与UIAutomation合作,我正在与本地化的BSTR进行斗争。我在德国,所以有一些特殊的角色在BSTR中表现得很有趣。我正在记录这些信息,需要将它们保存在UTF-8中,以便以后处理 我已经尝试了我能找到的关于WideCharToMultiByte的所有答案,但这只是将有趣的角色转换成更有趣的角色。如果有人能告诉我我做错了什么,我将不胜感激,这真的让我很烦恼 因此,我尝试了以下两种版本,两次都得到了这个结果(上面的版本是转换后的版本,下面的版本是原始版本): 第一个词应该是“Schal

我正在与UIAutomation合作,我正在与本地化的BSTR进行斗争。我在德国,所以有一些特殊的角色在BSTR中表现得很有趣。我正在记录这些信息,需要将它们保存在UTF-8中,以便以后处理

我已经尝试了我能找到的关于WideCharToMultiByte的所有答案,但这只是将有趣的角色转换成更有趣的角色。如果有人能告诉我我做错了什么,我将不胜感激,这真的让我很烦恼

因此,我尝试了以下两种版本,两次都得到了这个结果(上面的版本是转换后的版本,下面的版本是原始版本):

第一个词应该是“Schaltfläche”,第二个词应该是“Fünf”

我的密码:

BSTR* origin;
_bstr_t originWrapper(*origin);
char* originChar = originWrapper;
size_t len = strlen(originChar) + 1;
int room = MultiByteToWideChar(CP_ACP, 0, originChar, -1, NULL, 0);
wchar_t* unicodeString = (wchar_t*)malloc((sizeof(wchar_t))*room);
MultiByteToWideChar(CP_ACP, 0, originChar, -1, unicodeString, room);

int size_needed = WideCharToMultiByte(CP_UTF8, 0, unicodeString, -1, NULL, 0, NULL, NULL);
char* utf8Char = (char*) malloc(size_needed);
WideCharToMultiByte(CP_UTF8, 0, unicodeString, -1, utf8Char, size_needed, NULL, NULL);


BSTR
是指向UTF-16(
WCHAR
)字符数据的指针,前面是字符串长度。因此,通过窄字符串的往返是错误的,您应该直接使用
WideCharToMultiByte

std::string BSTRtoUTF8(BSTR bstr) {
    int len = SysStringLen(bstr);
    // special case because a NULL BSTR is a valid zero-length BSTR,
    // but regular string functions would balk on it
    if(len == 0) return "";
    int size_needed = WideCharToMultiByte(CP_UTF8, 0, bstr, len, NULL, 0, NULL, NULL);
    std::string ret(size_needed, '\0');
    WideCharToMultiByte(CP_UTF8, 0, bstr, len, ret.data(), ret.size(), NULL, NULL);
    return ret;
}

要检查转换的有效性,不要将结果输出到控制台,因为默认情况下它不支持UTF-8输出(它解释窄字符串,即使在
CP\u ACP
中,但在
CP\u OEM
中,见图)。相反,将输出写入文件,并使用支持UTF-8的可靠编辑器进行检查

BSTR
是指向UTF-16(
WCHAR
)字符数据的指针,前面是字符串长度。因此,通过窄字符串的往返是错误的,您应该直接使用
WideCharToMultiByte

std::string BSTRtoUTF8(BSTR bstr) {
    int len = SysStringLen(bstr);
    // special case because a NULL BSTR is a valid zero-length BSTR,
    // but regular string functions would balk on it
    if(len == 0) return "";
    int size_needed = WideCharToMultiByte(CP_UTF8, 0, bstr, len, NULL, 0, NULL, NULL);
    std::string ret(size_needed, '\0');
    WideCharToMultiByte(CP_UTF8, 0, bstr, len, ret.data(), ret.size(), NULL, NULL);
    return ret;
}

要检查转换的有效性,不要将结果输出到控制台,因为默认情况下它不支持UTF-8输出(它解释窄字符串,即使在
CP\u ACP
中,但在
CP\u OEM
中,见图)。相反,将输出写入文件,并使用支持UTF-8的可靠编辑器进行检查

调试编码问题的第一条规则:始终查看实际字节,因为打印可能会添加其他编码问题。您的
WideCharToMultiByte
调用报告的字节是什么?
BSTR
已经是
wchar\u t*
,为什么要将它们视为本地代码页窄字符串?
BSTR
已经是一个指针(指向宽字符串),所以
BSTR*
有点奇怪。
BSTR
s使用UTF16-LE编码。使用
CP\u UTF8
调用
WideCharToMultiByte
将生成一个UTF-8编码字符串。因为我们不知道,你是如何确定这些是“更有趣的”,我们无法帮助你。错误出现在您试图输出/显示/观察结果的部分。指针的出现是因为它是从一个函数复制的,该函数将它作为一个输入变量,我对此进行了监督,并将对其进行编辑。对不起@第一次尝试吗?那只是因为第二个问题不起作用,我试着从另一个问题上截取答案。显然,我没有真正想过。对于那些看起来更滑稽的角色,我加入了截图,因为很遗憾我无法复制和粘贴它。首先,我现在将研究字节并向您提供这些信息。调试编码问题的第一条规则:始终查看实际的字节,因为打印可能会增加额外的编码问题。您的
WideCharToMultiByte
调用报告的字节是什么?
BSTR
已经是
wchar\u t*
,为什么要将它们视为本地代码页窄字符串?
BSTR
已经是一个指针(指向宽字符串),所以
BSTR*
有点奇怪。
BSTR
s使用UTF16-LE编码。使用
CP\u UTF8
调用
WideCharToMultiByte
将生成一个UTF-8编码字符串。因为我们不知道,你是如何确定这些是“更有趣的”,我们无法帮助你。错误出现在您试图输出/显示/观察结果的部分。指针的出现是因为它是从一个函数复制的,该函数将它作为一个输入变量,我对此进行了监督,并将对其进行编辑。对不起@第一次尝试吗?那只是因为第二个问题不起作用,我试着从另一个问题上截取答案。显然,我没有真正想过。对于那些看起来更滑稽的角色,我加入了截图,因为很遗憾我无法复制和粘贴它。首先,我现在将研究字节,并向您提供这些信息。谢谢,它在日志文件中仍然不是100%正确,但这似乎是另一个额外的问题。至少现在它符合UTF-8标准,不再抛出异常:)哦,我的问题是我忘记了,控制台不支持UTF-8--谢谢,它在日志文件中仍然不是100%正确,但这似乎是另一个额外的问题。至少现在是UTF-8兼容,不再抛出异常:)哦,我的问题是我忘了,控制台不支持UTF-8--