我尝试获取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

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

6回复

BSTR可以保存超过16位的字符来表示吗?

我对Windows BSTR和WCHAR等感到困惑.WCHAR是一个16位字符,用于允许Unicode字符。 那些需要超过16位的字符呢? 一些UTF-8字符需要更多。 这是Windows的限制吗? 编辑:谢谢你的所有答案。 我想我理解Unicode方面。 我仍然对Windows
2回复

c ++无法获得“wcout”来打印unicode,并让“cout”工作

不能让“wcout”在多个代码页中打印unicode字符串,同时让“cout”工作 请帮我把这3行一起工作。 输出: 我试过了: 问题:“cout”失败了 尝试: 和: 和 和 没有任何效果
4回复

从C ++文件中读取Unicode字符

我想逐个字符地读取Unicode文件(UTF-8),但是我不知道如何从一个文件中一个字符地读取。 谁能告诉我该怎么做?
5回复

在std :: string中存储unicode UTF-8字符串

回应中的讨论 C ++中的跨平台字符串(和Unicode) 如何以跨平台友好的方式处理C / C ++中的Unicode字符串? 我正在尝试将一个UTF-8字符串分配给Visual Studio 2010环境中的std::string变量 std::string msg =
2回复

fstream :: open()在Windows上,Unicode或非Ascii字符不起作用(使用std :: ios :: out)

在C ++项目中,我想打开一个文件( fstream::open() )(这似乎是一个主要问题)。 我的程序的Windows版本失败了。 文件“ä”(UTF-8 0xC3 0xA4) 字符串s是UTF-8编码的,但随后从UTF-8转换为Latin1(0xE4)。 我正在使用Qt
3回复

UNICODE,UTF-8和Windows混乱

我正在尝试在Windows中实现文本支持,以便稍后转移到Linux平台。 以统一的方式支持国际语言是理想的,但在考虑这两个平台时似乎并不容易实现。 我花了相当多的时间阅读UNICODE,UTF-8(和其他编码),宽带等等,这是我到目前为止所理解的: UNICODE作为标准,描述了可映射
1回复

在Visual Studio中显示Unicode

我已经尝试了几乎所有在Visual Studio 2013 C ++中显示Unicode的方法。 从...开始: 在Visual Studio中更改“字符集”。 我很高兴获得一些应做的帮助。
1回复

在Windows下如何使用mingw用ifstream打开unicode文件?

请注意,这与如何使用Unicode文件名打开std :: fstream(流或ifstream)的问题不同。 。 这个问题是关于unicode 文件名的 ,这个问题是关于unicode文件的内容的 。 我需要使用ifstream打开UTF-8 Unicode文件(包含西班牙语字符)。
5回复

Windows下的宽字符或UTF-8? [关闭]

我们正在将Windows代码从旧字符集转换为Unicode。 我们的GUI代码使用MFC,但我们还有许多非GUI模块将被整合到非MFC环境中。 UTF-8是保存数据文件最具前瞻性的方法吗? Windows系统调用必须使用宽字符串,否则它们将在遗留代码页中进行解释。 对于程序中的一
2回复

C ++ Windows十进制转换为UTF-8字符

我一直在使用下面的函数将Unicode字符的十进制表示形式转换为C ++中的UTF8字符本身。 我目前拥有的功能在Linux / Unix系统上运行良好,但在Windows上始终返回错误的字符。 谁能在Windows上提供我正在使用的替代功能或当前功能的修复程序? -更新-