如何将ANSI字节转换为Unicode字符串?

7
我有一个代表字符串中字符的vector<BYTE>。我想将这些字符解释为ASCII字符,并将它们存储在Unicode (UTF-16)字符串中。当前代码假定vector<BYTE>中的字符是Unicode而不是ASCII,对于标准ASCII来说,这样做没问题,但对于扩展ASCII字符来说则失败了。这些字符需要使用通过GetACP()获取的当前代码页进行解释。我该如何使用这些ASCII字符创建Unicode (UTF-16)字符串?
编辑:我认为解决方案应该与这里讨论的宏有关:http://msdn.microsoft.com/en-us/library/87zae4a3(v=vs.80).aspx,但我不确定实际实现应该怎么做。
int ExtractByteArray(CATLString* pszResult, const CByteVector* pabData)
{
    // place the data into the output cstring
    pszResult->Empty();
    for(int iIndex = 0; iIndex < pabData->GetSize(); iIndex++)
        *pszResult += (TCHAR)pabData->GetAt(iIndex);

    return RC_SUCCESS;
}

2
如果你正在使用MFC,难道不能让CString自动处理吗? - David Heffernan
2
我有一个vector<BYTE>,它表示字符串中的字符。- 为什么不使用std::string - LihO
2
没有所谓的“扩展ASCII”。有相当多不同的8位单字节编码与ASCII的前128个代码点相同,但它们并不是ASCII(而且有很多种)。 - James Kanze
1
以下是 CString 构造函数:http://msdn.microsoft.com/zh-cn/library/cws1zdt8(v=vs.110).aspx 只需使用接收指向 char 和长度的指针的构造函数,您的工作就完成了。 - David Heffernan
@bgh10788:那么我认为将位图的二进制数据转换为任何类型的字符串(无论是UTF-16还是其他)都没有意义。 - LihO
显示剩余3条评论
3个回答

5

5
可以这样做,但使用适当的 CString 构造函数并让它进行转换会更容易。 - David Heffernan
@DavidHeffernan 当然更好,但它仅适用于MFCATL应用程序(我猜它解决了bgh10788的问题),但这个函数适用于Windows上的任何程序和框架。 - BigBoss
但是问题标签为MFC并且涉及到CATLString,因此这样的解决方案似乎是合适的。 - David Heffernan
ASCII字符是1个字节,Unicode是2个字节。因此,multibytetowidechar不是正确的函数——ASCII根本就不是多字节! - Owl

1
由于您正在使用MFC,让CString来完成这项工作。

1
我有一个表示字符串中字符的vector<BYTE>。我想将这些字符解释为ASCII字符,并将它们存储在Unicode(UTF-16)字符串中。
当您处理二进制数据时,应使用std::vector<BYTE>。处理字符串时,请改用std::string。请注意,此std::string对象将包含特殊字符,这些字符将由一个或多个字节的序列编码(因此称为多字节字符),但这些不是 ASCII字符。
一旦使用std::string,您可以使用MultiByteToWideChar创建自己的函数,该函数将把包含多字节UTF-8字符的std::string转换为包含UTF-16编码点的std::wstring
// multi byte to wide char:
std::wstring s2ws(const std::string& str)
{
    int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
    std::wstring wstrTo(size_needed, 0);
    MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
    return wstrTo;
}

但我正在处理二进制数据。这个函数的目的是将这些二进制数据转换为CATLString。 - bgh10788
@bgh10788:为什么要将二进制数据转换为字符串?这没有任何意义。如果它是二进制数据,那么就将其视为二进制数据处理。如果它是一个字符串,那么就将其视为字符串处理。 - LihO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接