【发布时间】:2019-12-11 07:17:53
【问题描述】:
以下是我的问题的简化示例。我有一些外部字节数据,它似乎是一个带有 cp1252 编码度符号0xb0 的字符串。当它作为std::string 存储在我的程序中时,它正确地表示为0xffffffb0。但是,当将该字符串写入文件时,生成的文件只有一个字节长,只有0xb0。如何将字符串写入文件? UTF-8这个概念是怎么来的?
#include <iostream>
#include <fstream>
typedef struct
{
char n[40];
} mystruct;
static void dump(const std::string& name)
{
std::cout << "It is '" << name << "'" << std::endl;
const char *p = name.data();
for (size_t i=0; i<name.size(); i++)
{
printf("0x%02x ", p[i]);
}
std::cout << std::endl;
}
int main()
{
const unsigned char raw_bytes[] = { 0xb0, 0x00};
mystruct foo;
foo = *(mystruct *)raw_bytes;
std::string name = std::string(foo.n);
dump(name);
std::ofstream my_out("/tmp/out.bin", std::ios::out | std::ios::binary);
my_out << name;
my_out.close();
return 0;
}
运行上述程序会在 STDOUT 上产生以下结果
It is '�'
0xffffffb0
【问题讨论】:
-
如果实际字节为 0xb0,您期望什么?忘记 ansi 字符串并在应用程序内使用 unicode,序列化使用 UTF-8。
-
std::string name = std::string(foo.n);-- 这不会构造一个包含两个字符的字符串。 -
顺便说一句,在 C++ 中,
typedef不需要struct。 -
1.
*(mystruct *)raw_bytes不合法,任何事情都可能发生。 2.0xffffffb0是0xb0char值转换为int。它与 ASCII、cp1252 或任何此类性质的东西无关。 -
@MichaelChourdakis - 您能否说明我将如何将包含非 ascii 字节 0xb0 的外部数据转换为 unicode 字符串?
标签: c++ string utf-8 non-ascii-characters utf