gpt4 book ai didi

c++ - 将带有非 ascii 数据的 std::string 写入文件

转载 作者:行者123 更新时间:2023-11-28 01:19:16 33 4
gpt4 key购买 nike

下面是我的问题的一个简化示例。我有一些外部字节数据,它似乎是一个带有 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

最佳答案

首先,这是一篇必读的文章:

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

现在,完成后,您必须了解什么类型代表 p[i] .

char ,在 C 中是一个小整数值,带有 sign ! char可以是负数!

现在,因为你有 cp1252字符,它们在 ASCII 的范围之外。这意味着这些字符被视为负值!

现在,当它们转换为 int 时,符号位被复制,当您尝试打印它时,您将看到 0xffffff<actual byte value> .

C 中处理, 首先你应该转换为 unsigned char :

printf("0x%02x ", (unsigned char)p[i]);

然后默认转换将用零和 printf() 填充缺失的位会给你一个合适的值(value)。

现在,在 C++ 中,这有点令人讨厌,因为 charunsigned char被流运算符视为字符表示。所以要以十六进制方式打印它们,应该是这样的:

int charToInt(char ch) 
{
return static_cast<int>(static_cast<unsigned char>(ch));
}

std::cout << std::hex << charToInt(s[i]);

现在,直接从char转换至 unsigned int不会解决问题,因为编译器会默默地执行与 int 的对话首先。

参见此处:https://wandbox.org/permlink/sRmh8hZd78Oar7nF

UTF-8 与此问题无关。

题外话:拜托,当你写纯C++代码时,不要使用C .它毫无意义,使代码更难维护,而且速度也不快。所以:

  • 不要使用char*char[]存储字符串。只需使用 std::string .
  • 不要使用printf() , 使用 std::cout (或 fmt 库,如果您喜欢格式字符串 - 它将成为 future 的 C++ 标准)。
  • 不要使用alloc() , malloc() , free() - 在现代 C++ 中,使用 std::make_unique()std::make_shared() .

关于c++ - 将带有非 ascii 数据的 std::string 写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57330248/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com