Мне нужно загрузить файл шаблона HTML (используя std::ifstream
), добавьте некоторый контент, а затем сохраните его как полную веб-страницу. Было бы достаточно просто, если бы не польские символы — я перепробовал все комбинации char
/wchar_t
, Unicode
/Multi-Byte
набор символов, iso-8859-2
/utf-8
, ANSI
/utf-8
и ни один из них не работал для меня (всегда были некоторые неправильно отображаемые символы (или некоторые из них вообще не отображались).
Я мог бы вставить здесь много кода и файлов, но я не уверен, что это поможет. Но, возможно, вы могли бы просто сказать мне: какой формат / кодировка должен иметь файл шаблона, какую кодировку я должен объявить в нем для веб-страницы и как мне загрузить и сохранить этот файл, чтобы получить надлежащие результаты?
(Если мой вопрос недостаточно конкретен или вы делать требовать примеры кода / файла, дайте мне знать.)
Редактировать:
Я попробовал библиотеку, предложенную в комментарии:
std::string fix_utf8_string(std::string const & str)
{
std::string temp;
utf8::replace_invalid(str.begin(), str.end(), back_inserter(temp));
return str;
}
Вызов:
fix_utf8_string("wynik działania pozytywny ąśżźćńłóę");
Броски: utf8::not_enough_room
— Что я делаю неправильно?
Не уверен, что это (идеальный) способ пойти, но следующее решение сработало для меня!
Я сохранил свой файл шаблона HTML как ANSI (или, по крайней мере, так говорит Notepad ++) и изменил каждую операцию записи в файл:
file << std::string("some text with polish chars: ąśżźćńłóę");
чтобы:
file << ToUtf8("some text with polish chars: ąśżźćńłóę");
где:
std::string ToUtf8(std::string ansiText)
{
int ansiRequiredSize = MultiByteToWideChar(1250, 0, ansiText.c_str(), ansiText.size(), NULL, 0);
wchar_t * wideText = new wchar_t[ansiRequiredSize + 1];
wideText[ansiRequiredSize] = NULL;
MultiByteToWideChar(1250, 0, ansiText.c_str(), ansiText.size(), wideText, ansiRequiredSize);
int utf8RequiredSize = WideCharToMultiByte(65001, 0, wideText, ansiRequiredSize, NULL, 0, NULL, NULL);
char utf8Text[1024];
utf8Text[utf8RequiredSize] = NULL;
WideCharToMultiByte(65001, 0, wideText, ansiRequiredSize, utf8Text, utf8RequiredSize, NULL, NULL);
delete [] wideText;
return utf8Text;
}
Основная идея заключается в использовании MultiByteToWideChar()
а также WideCharToMultiByte()
функции для преобразования строки из ANSI (многобайтовый) в широкий символ, а затем из широкого символа в utf-8 (подробнее здесь: http://www.chilkatsoft.com/p/p_348.asp). Самое приятное, что мне не пришлось ничего менять (т. Е. std::ofstream
в std::wofstream
или используя любую стороннюю библиотеку или изменив способ, которым я на самом деле использую файловый поток (вместо преобразования строк в utf-8, что необходимо))!
Вероятно, должно работать и для других языков, хотя я не проверял это.
Других решений пока нет …