考虑这个程序:
#include <stdio.h>
int main() {
printf("%s\n", __FILE__);
return 0;
}
根据文件名,这个程序是工作的-或者不工作。我面临的问题是,我想以编码安全的方式打印当前文件的名称。然而,如果文件包含无法在当前代码页中表示的特殊字符,则编译器会产生警告(理所当然):
?????????.c(3) : warning C4566: character represented by universal-character-name '\u043F' cannot be represented in the current code page (1252)
我该如何解决这个问题?我想将__FILE__
生成的字符串存储为UTF-16编码,以便在运行时可以将其转换为任何其他系统使用的编码格式并正确打印出来。为此,我需要了解以下几点:
__FILE__
生成的字符串使用的是什么编码格式?似乎至少在Windows上使用当前系统代码页(在我的情况下是Windows-1252) - 但这只是猜测。这是真的吗?- 我如何在构建时将该字符串存储为UTF-8(或UTF-16)编码的表示?
我的实际用例:我有一个宏,用于跟踪当前程序执行,将当前源代码/行号信息写入文件。它看起来像这样:
struct LogFile {
// Write message to file. The file should contain the UTF-8 encoded data!
void writeMessage( const std::string &msg );
};
// Global function which returns a pointer to the 'active' log file.
LogFile *activeLogFile();
#define TRACE_BEACON activeLogFile()->write( __FILE__ );
如果当前源文件的文件名包含当前代码页无法表示的字符,则会出现问题。