【问题标题】:How to convert ANSI byte to Unicode string?如何将 ANSI 字节转换为 Unicode 字符串?
【发布时间】:2013-02-05 17:03:22
【问题描述】:

我有一个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;
}

【问题讨论】:

  • 如果你用的是MFC,难道不能让CString自动做吗?
  • “我有一个vector&lt;BYTE&gt;,它代表字符串中的字符。” - 为什么不是std::string
  • 没有“扩展ASCII”之类的东西。 很多不同的 8 位单字节编码,它们的前 128 个代码点与 ASCII 相同,但它们不是 ASCII(其中有很多)。
  • 这里是CString 构造函数:msdn.microsoft.com/en-US/library/cws1zdt8(v=vs.110).aspx 只需使用接收指向char 的指针和长度的构造函数,您的工作就完成了。
  • @LihO 数据以这种通用方式从设备返回。然后根据一组给定的标准对其进行解释。数据可以是整数、位图、字符串等。

标签: c++ visual-c++ mfc atl


【解决方案1】:

您应该使用 MultibyteToWideChar 将该字符串转换为 unicode

【讨论】:

  • 你可以这样做,但使用适当的CString 构造函数并让它转换更容易。
  • @DavidHeffernan 当然更好,但它只适用于MFCATL 应用程序(我想它解决了bgh10788 的问题)但这个功能适用于任何程序和框架在Windows
  • 但是问题标签 MFC 和名称 CATLString,所以这样的解决方案似乎是合适的。
  • ASCII 字符为 1 个字节,unicode 为 2 个字节。因此 multibytetowidechar 不是正确的函数 - ASCII 不是以多字节开头的!
【解决方案2】:

我有一个vector&lt;BYTE&gt;,它代表字符串中的字符。我想将这些字符解释为 ASCII 字符并将它们存储在 Unicode (UTF-16) 字符串中

只有在处理二进制数据时才应该使用std::vector&lt;BYTE&gt;。使用字符串时,请改用std::string。请注意,此std::string 对象将包含特殊字符,这些字符将由一个或多个字节的序列编码(因此称为多字节 字符),但这些不是ASCII 字符。

使用std::string 后,您可以使用MultiByteToWideChar 创建自己的函数,将std::string(包含多字节UTF-8 字符)转换为包含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:为什么要将二进制数据转换为字符串?这是没有意义的。如果是二进制数据,则将其视为二进制数据。如果它是一个字符串,则将其视为一个。
【解决方案3】:

既然您使用的是 MFC,就让CString 来完成这项工作。

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 2011-06-09
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 2021-05-11
    • 2011-10-27
    相关资源
    最近更新 更多