我尝试获取Unicode字符的二进制utf-8表示形式,如图像上所示:

在此处输入图片说明

但这仅适用于<128个字符:

在此处输入图片说明

这是我的代码:

#include <string>
#include <iostream>
#include <windows.h>

std::string contoutf8(std::wstring str)
{    
    int utf8_size = WideCharToMultiByte(CP_UTF8, 0, str.c_str(),
                    str.length(), nullptr, 0, nullptr, nullptr);
    std::string utf8_str(utf8_size, '\0');
    WideCharToMultiByte(CP_UTF8, 0, str.c_str(), str.length(), 
                    &utf8_str[0], utf8_size, nullptr, nullptr);
    return utf8_str;
}

std::string contobin(std::string str)
{
    std::string result;
    for(int i=0; i<str.size(); ++i)
        for(int j=0; j < 8; ++j)
            result.append((1<<j) & str[i] ? "1" : "0");
    return result;
}

int main()
{
    std::wstring str  = L"\u20AC";
    std::string utf8 = contoutf8(str);
    std::string bin  = contobin(utf8);

    std::cout << bin;
}

我检查了许多代码组合(以上是最后一个代码),但没有一个以11格式给出二进制表示……这表明这是Unicode字符。

===============>>#1 票数:2

您可以考虑使用std::bitset ,而不是自己转换为二进制:

#include <bitset>

std::string contoutf8(std::wstring str)
{    
    int utf8_size = WideCharToMultiByte(CP_UTF8, 0, str.c_str(),
                    str.length(), nullptr, 0, nullptr, nullptr);
    std::string utf8_str(utf8_size, '\0');
    WideCharToMultiByte(CP_UTF8, 0, str.c_str(), str.length(), 
                    &utf8_str[0], utf8_size, nullptr, nullptr);
    return utf8_str;
}

int main()
{
    std::wstring str  = L"\u20AC";
    std::string utf8 = contoutf8(str);

    std::copy(utf8.begin(), utf8.end(), std::ostream_iterator<std::bitset<8>>(std::cout, "\t"));
}

===============>>#2 票数:1 已采纳

两个问题:

  1. 反向位模式(二进制从左至右读取位7到0)。

  2. 标志扩展

std::string contobin(std::string str)
{
    std::string result;
    for(int i=0; i<str.size(); ++i)
        for(int j=8; j--;) {
            result.append((1<<j) & uint8_t(str[i]) ? "1" : "0");
        }
    return result;
}

  ask by niceday translate from so

未解决问题?本站智能推荐: