Загрузите и сохраните файл HTML с польскими символами

Мне нужно загрузить файл шаблона 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 — Что я делаю неправильно?

1

Решение

Не уверен, что это (идеальный) способ пойти, но следующее решение сработало для меня!

Я сохранил свой файл шаблона 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, что необходимо))!

Вероятно, должно работать и для других языков, хотя я не проверял это.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]