Рассмотрим эту программу:
#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, чтобы я мог корректно печатать его на любой другой системе во время выполнения (путем преобразования сохраненного представления 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__ );
Это прерывается, если текущий исходный файл имеет имя, которое содержит символы, которые не могут быть представлены текущей кодовой страницей.