Генератор случайных чисел создает псевдослучайные числа. Чтобы получить разные числа на каждом прогоне, вам необходимо ввести случайное семя в начале вашей программы. Это выбирает другую начальную позицию в псевдослучайном потоке.
В моей системе следующее производит правильный вывод. Попробуйте в вашей системе. Я уверен, что он даст похожие результаты.
#include <string>
#include <iostream>
using namespace std;
int main()
{
string s="mit freundlichen Grüßen";
cout << s << endl;
return 0;
}
Если это нормально, это указывает на то, что веб-передача не является 8-битной.
Mike.
Если вы работаете в Windows, то я бы предложил использовать Unicode UTF-16 на границе Windows.
Мне кажется, что в Windows с Visual C ++ (по крайней мере до VS2015) std::cout
не может выводить текст с кодировкой UTF-8, но std::wcout
корректно выводит текст в кодировке UTF-16.
Этот скомпилированный фрагмент кода корректно выводит вашу строку, содержащую немецкие символы:
#include <fcntl.h>
#include <io.h>
#include <iostream>
int main()
{
_setmode(_fileno(stdout), _O_U16TEXT);
// ü : U+00FC
// ß : U+00DF
const wchar_t * text = L"mit freundlichen Gr\u00FC\u00DFen";
std::wcout << text << L'\n';
}
Обратите внимание на использование строки wchar_t
с кодировкой UTF-16.
Вкл. более общее замечание, я бы предложил вам использовать кодировку UTF-8 (и, например, сохранить текст в std::string
s) в вашей кросс-платформенной C ++ части кода и преобразовать в UTF-16 -кодированный текст на границе Windows .
Для преобразования между UTF-8 и UTF-16 вы можете использовать Windows API, такие как MultiByteToWideChar
и WideCharToMultiByte
. Это API-интерфейсы C, которые можно безопасно и удобно упаковать в код C ++ (более подробную информацию можно найти в этой статье MSDN , и вы можете найти компилируемый код C ++ здесь, на GitHub ).
, содержащий символы Unicode
Вы забыли указать , в котором кодировка Unicode содержит строку. Существует «узкий» UTF-8, который может быть сохранен в
std::string
и напечатан с использованиемstd::cout
, а также с более широкими вариантами, что невозможно. Крайне важно знать, с какой кодировкой вы имеете дело. В оставшейся части моего ответа я предполагаю, что вы хотите использовать UTF-8.
Когда я хочу напечатать эту строку с помощью:
cout << UnicodeString << endl;
EDIT:
Важно отметить, что приложение является CGI, запущенным на Ubuntu, отвечая на запросы браузера
. Проблемы здесь немного отличаются от печати на терминале.
- Вам необходимо соответствующим образом настроить заголовок ответа
Content-Type
, иначе клиент не сможет понять, как интерпретировать ответ. НапримерContent-Type: application/json; charset=utf-8
.- Вам все равно нужно убедиться, что исходная строка на самом деле является правильной кодировкой, соответствующей заголовку. См. Старый ответ ниже для обзора.
- Браузер должен поддерживать кодировку. Большинство современных браузеров долгое время поддерживали UTF-8.
Ответ на печать на терминал:
Предполагая, что
UnicodeString
действительно содержит кодированную строку UTF-8- и что терминал использует кодировку UTF-8
- , а шрифт, используемый терминалом, имеет графемы, которые вы используйте
, что выше должно работать.
выводит:
mit freundlichen Gr??en
. Тогда оказывается, что по крайней мере одно из приведенных выше предположений не выполняется.
Независимо от того, является ли 1. истинным, вы можете проверить, проверив числовое значение каждого блока кода отдельно и сравнив его с тем, что вы ожидаете от UTF-8. Если 1. неверно, то вам нужно выяснить, какая кодировка действительно использует строка, и либо преобразовать кодировку, либо настроить терминал для использования этой кодировки.
- Терминал обычно , но не обязательно, использует внутреннюю кодировку системы. Первый шаг по выяснению того, что кодирует ваш терминал / система, - это выяснить, какой терминал / система вы используете в первую очередь. Детали, вероятно, находятся в руководстве. Если на терминале нет , используйте UTF-8, тогда вам нужно преобразовать строку UFT-8 в вашу программу в кодировку символов, которую использует терминал - если только эта кодировка не имеет графем которые вы хотите распечатать. К сожалению, стандартная библиотека не обеспечивает поддержку конвертации произвольного символьного кодирования (есть некоторая поддержка для конвертации между узким и широким юникодом, но даже эта поддержка устарела). Здесь вы можете найти стандарт unicode здесь , хотя я хотел бы указать, что использование существующей конверсионной реализации может сэкономить много работы. В случае, если кодировка символа терминала не имеет необходимых графех - или если вы не хотите внедрять преобразование кодирования - это перенастройка терминала для использования UTF-8. Если терминал / система может быть настроен на использование UTF-8, в руководстве должны быть детали.
- Вы должны проверить, действительно ли сам шрифт имеет требуемые графемы, просто введя символы в терминал и посмотреть, показывают ли они, как они должны, хотя этот тест также потерпит неудачу, если в терминальной кодировке нет графем, поэтому сначала проверьте это. Руководство вашего терминала должно объяснить, как изменить шрифт, если это необходимо. Тем не менее, я ожидал бы, что
üß
будет существовать в большинстве шрифтов.