fastcgipp <нет вывода для символов utf8
редактировать
Я решил проблему здесь, набрав out << L"Swedish: å ä ö Å Ä Ö"
, то есть префикс L перед строкой, объясненный в этом ответе: Что такое префикс L в C++?Мой вопрос сейчас, если это хорошее решение или есть предпочтительная альтернатива для решения этого?
Код
Следующий отредактированный метод от http://www.nongnu.org/fastcgipp/doc/2.1/a00004.html:
bool response()
{
wchar_t russian[]={ 0x041f, 0x0440, 0x0438, 0x0432, 0x0435, 0x0442, 0x0020, 0x043c, 0x0438, 0x0440, 0x0000 };
wchar_t chinese[]={ 0x4e16, 0x754c, 0x60a8, 0x597d, 0x0000 };
wchar_t greek[]={ 0x0393, 0x03b5, 0x03b9, 0x03b1, 0x0020, 0x03c3, 0x03b1, 0x03c2, 0x0020, 0x03ba, 0x03cc, 0x03c3, 0x03bc, 0x03bf, 0x0000 };
wchar_t japanese[]={ 0x4eca, 0x65e5, 0x306f, 0x4e16, 0x754c, 0x0000 };
wchar_t runic[]={ 0x16ba, 0x16d6, 0x16da, 0x16df, 0x0020, 0x16b9, 0x16df, 0x16c9, 0x16da, 0x16de, 0x0000 };
out << "Content-Type: text/html; charset=utf-8\r\n\r\n";
out << "<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' />";
out << "<title>fastcgi++: Hello World in UTF-8</title></head><body>";
out << "English: Hello World<br />";
out << "Russian: " << russian << "<br />";
out << "Greek: " << greek << "<br />";
out << "Chinese: " << chinese << "<br />";
out << "Japanese: " << japanese << "<br />";
out << "Runic English?: " << runic << "<br />";
out << "Swedish: å ä ö Å Ä Ö<br />";
out << "</body></html>";
return true;
}
Сырой выход
Content-Type: text/html; charset=utf-8
<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' /><title>fastcgi++: Hello World in UTF-8</title></head><body>English: Hello World<br />Russian: Привет мир<br />Greek: Γεια σας κόσμο<br />Chinese: 世界您好<br />Japanese: 今日は世界<br />Runic English?: ᚺᛖᛚᛟ ᚹᛟᛉᛚᛞ<br />Swedish: <br /></body></html>
Взаимодействие браузера
English: Hello World
Russian: Привет мир
Greek: Γεια σας κόσμο
Chinese: 世界您好
Japanese: 今日は世界
Runic English?: ᚺᛖᛚᛟ ᚹᛟᛉᛚᛞ
Swedish:
Как видно выше, последняя шведская строка имеет ожидаемое поведение вывода "å ä ö Å Ä Ö". Однако по какой-то причине это заменяется пробелами. Должен быть способ, чтобы я не слишком точно печатал шестнадцатеричное представление этой буквы в юникоде.
После некоторого поиска Google я попытался добавить setLocale
в начале основной сценарий безуспешно.
Почему это происходит?
Как я могу решить эту проблему, чтобы иметь возможность свободно использовать любой символ utf8 при кодировании, как описано выше?
1 ответ
Это работает в Linux:
#include <iostream>
#include <locale>
bool response()
{
wchar_t russian[]={ 0x041f, 0x0440, 0x0438, 0x0432, 0x0435, 0x0442, 0x0020, 0x043c, 0x0438, 0x0440, 0x0000 };
wchar_t chinese[]={ 0x4e16, 0x754c, 0x60a8, 0x597d, 0x0000 };
wchar_t greek[]={ 0x0393, 0x03b5, 0x03b9, 0x03b1, 0x0020, 0x03c3, 0x03b1, 0x03c2, 0x0020, 0x03ba, 0x03cc, 0x03c3, 0x03bc, 0x03bf, 0x0000 };
wchar_t japanese[]={ 0x4eca, 0x65e5, 0x306f, 0x4e16, 0x754c, 0x0000 };
wchar_t runic[]={ 0x16ba, 0x16d6, 0x16da, 0x16df, 0x0020, 0x16b9, 0x16df, 0x16c9, 0x16da, 0x16de, 0x0000 };
std::wcout << "Content-Type: text/html; charset=utf-8\r\n\r\n" << std::endl;
std::wcout << "<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' />" << std::endl;
std::wcout << "<title>fastcgi++: Hello World in UTF-8</title></head><body>" << std::endl;
std::wcout << "English: Hello World<br />" << std::endl;
std::wcout << "Russian: " << russian << "<br />" << std::endl;
std::wcout << "Greek: " << greek << "<br />" << std::endl;
std::wcout << "Chinese: " << chinese << "<br />" << std::endl;
std::wcout << "Japanese: " << japanese << "<br />" << std::endl;
std::wcout << "Runic English?: " << runic << "<br />" << std::endl;
std::wcout << L"Swedish: å ä ö Å Ä Ö<br />" << std::endl;
std::wcout << "</body></html>" << std::endl;
return true;
}
int main()
{
std::locale::global(std::locale(""));
response();
}
Примечание (1) вывод в широкий поток и (2) шведский строковый литерал широкий (L"whatever"
). Префикс L ("Long") перед строковым литералом означает, что литерал является литералом с широкими строками (wchar_t[]
), в отличие от обычного строкового литерала (char[]
).
Узкие строковые литералы здесь не работают, потому что узкая кодировка по умолчанию является UTF-8, и по умолчанию нет преобразования из UTF-8 в какую бы то ни было широкую кодировку (вероятно, UCS4). Каждый байт просто расширен, что совершенно неправильно. Если вы хотите, вы можете преобразовать его самостоятельно или использовать одну из стандартных функций преобразования: mbstowcs (не очень переносимый) или wstring_convert C++ 11 (на самом деле не работает с gcc / libstdC++, работает с clang / libC++).
Как заставить это работать на Windows, никто не знает.
Рекомендуется придерживаться либо char
и UTF-8, или wchar_t
а также UCS4
(в Linux). Поскольку вы хотите вывести UTF-8, разумно использовать char
не wchar_t
,