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