C++:std::ofstream 文本文件写入过程中的韩文字母编码问题

C++: Problem of Korean alphabet encoding in text file write process with std::ofstream

我有一个将日志保存为文本文件的代码。

通常效果很好,但我发现了一个不起作用的情况:

{Id": "testman", "ip": "192.168.1.1", "target": "?뚯뒪??exe", "desc": "?덈뀞諛⑷??뚯슂"}

我的代码是一个简单的逻辑,将日志字符串保存为文本文件。

我的代码在日志为英文时运行良好,但在日志为韩文时出现问题。

经过各种实验确认,如果文件可以保存为utf-8格式,韩语不会有问题。

我想,如果日志字符串中包含韩语,c++基本就保存为ANSI格式了。

这是我的 C++ 代码:

string logfilePath = {path};
log = "{\Id\": \"testman\", \"ip\": \"192.168.1.1\", \"target\": \"테스트.exe\", \"desc\": \"안녕방가워요\"}";

ofstream output(logFilePath, ios::app);
output << log << endl;
output.close();

有没有办法将日志文件保存为 uft-8 或其他任何好方法?

请多多指教

TDLR: 在写出字符串之前在文件开头写入 0xefbbbf(3 字节 UTF-8 BOM)。

文本查看器软件用来确定文件是否应以 Unicode 格式显示的提示之一是所谓的字节顺序标记(或简称 BOM)。它基本上是文本流开头的一系列字节,指定文本字符串的编码和字节顺序。对于 UTF-8 是这三个字节 0xEF 0xBB 0xBF.

您可以通过打开记事本、写入单个字符并以 ANSI 格式保存文件来进行试验。然后查看文件的大小(以字节为单位)。它将是 1 个字节。现在打开文件并将其保存为 UTF-8 并再次查看文件的大小。它将占用 4 个字节,即三个字节用于 BOM,一个字节用于您放入其中的单个字符。您可以通过在某些十六进制编辑器中查看这两个文件来确认这一点。

也就是说,您可能需要在将字符串写入文件之前将这些字节插入到文件中。那么为什么是UTF-8呢?您可能会问,这取决于原始字符串的编码方式(您的 std::string log),在这种情况下,它是在源文件中编写的字符串文字,其编码(很可能)是 UTF-8。因此,构成字符串的字节是根据此编码生成的,并被放入您的可执行文件中。 请注意 std::string 可以包含 Unicode 字符串,只是无法理解它。例如,它报告其长度错误。但它可以用来携带 Unicode 字符串。

您可以在 File->Advanced Save Options 中设置 UTF-8

如果找不到,可以在Tools->Customize->Commands->Add Command..->File中添加Advanced Save Options