#include <iostream> #include <iterator> #include <string> #include "cmsys/FStream.hxx" #ifdef _WIN32 # include <windows.h> #endif int main(int argc, char* argv[]) { if (argc <= 2) { std::cout << "Usage: testEncoding <encoding> <file>" << std::endl; return 1; } std::string const encoding(argv[1]); #ifdef _WIN32 unsigned int codePage = 0; if ((encoding == "UTF8") || (encoding == "UTF-8")) { codePage = CP_UTF8; } else if (encoding == "ANSI") { codePage = CP_ACP; } else if (encoding == "OEM") { codePage = CP_OEMCP; } else if (unsigned int consoleOutputCP = GetConsoleOutputCP()) { codePage = consoleOutputCP; } else if (unsigned int ansiCP = GetACP()) { codePage = ansiCP; } #endif cmsys::ifstream file(argv[2]); if (!file.is_open()) { std::cout << "Failed to open file: " << argv[2] << std::endl; return 2; } std::string text((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>()); #ifdef _WIN32 if (codePage) { if (int wlen = MultiByteToWideChar(CP_UTF8, 0, text.data(), int(text.size()), nullptr, 0)) { std::vector<wchar_t> w(wlen); if (MultiByteToWideChar(CP_UTF8, 0, text.data(), int(text.size()), w.data(), w.size())) { if (int nlen = WideCharToMultiByte(codePage, 0, w.data(), int(w.size()), nullptr, 0, nullptr, nullptr)) { std::vector<char> n(nlen); if (WideCharToMultiByte(codePage, 0, w.data(), int(w.size()), n.data(), int(n.size()), nullptr, nullptr)) { text = std::string(n.data(), n.size()); } } } } } #endif std::cout << text; return 0; }