Выход C ++ Unicode в переменной

Генератор случайных чисел создает псевдослучайные числа. Чтобы получить разные числа на каждом прогоне, вам необходимо ввести случайное семя в начале вашей программы. Это выбирает другую начальную позицию в псевдослучайном потоке.

4
задан Thomas van Hesteren 13 July 2018 в 13:09
поделиться

3 ответа

В моей системе следующее производит правильный вывод. Попробуйте в вашей системе. Я уверен, что он даст похожие результаты.

#include <string>
#include <iostream>
using namespace std;

int main()
{
    string s="mit freundlichen Grüßen";
    cout << s << endl;
    return 0;
}

Если это нормально, это указывает на то, что веб-передача не является 8-битной.

Mike.

1
ответ дан Michael Surette 17 August 2018 в 13:19
поделиться

Если вы работаете в 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 ).

0
ответ дан Mr.C64 17 August 2018 в 13:19
поделиться

, содержащий символы Unicode

Вы забыли указать , в котором кодировка Unicode содержит строку. Существует «узкий» UTF-8, который может быть сохранен в std::string и напечатан с использованием std::cout, а также с более широкими вариантами, что невозможно. Крайне важно знать, с какой кодировкой вы имеете дело. В оставшейся части моего ответа я предполагаю, что вы хотите использовать UTF-8.


Когда я хочу напечатать эту строку с помощью:

cout << UnicodeString << endl;

EDIT:

Важно отметить, что приложение является CGI, запущенным на Ubuntu, отвечая на запросы браузера

. Проблемы здесь немного отличаются от печати на терминале.

  1. Вам необходимо соответствующим образом настроить заголовок ответа Content-Type, иначе клиент не сможет понять, как интерпретировать ответ. Например Content-Type: application/json; charset=utf-8.
  2. Вам все равно нужно убедиться, что исходная строка на самом деле является правильной кодировкой, соответствующей заголовку. См. Старый ответ ниже для обзора.
  3. Браузер должен поддерживать кодировку. Большинство современных браузеров долгое время поддерживали UTF-8.

Ответ на печать на терминал:

Предполагая, что

  1. UnicodeString действительно содержит кодированную строку UTF-8
  2. и что терминал использует кодировку UTF-8
  3. , а шрифт, используемый терминалом, имеет графемы, которые вы используйте

, что выше должно работать.

выводит:

mit freundlichen Gr??en

. Тогда оказывается, что по крайней мере одно из приведенных выше предположений не выполняется.

Независимо от того, является ли 1. истинным, вы можете проверить, проверив числовое значение каждого блока кода отдельно и сравнив его с тем, что вы ожидаете от UTF-8. Если 1. неверно, то вам нужно выяснить, какая кодировка действительно использует строка, и либо преобразовать кодировку, либо настроить терминал для использования этой кодировки.

  1. Терминал обычно , но не обязательно, использует внутреннюю кодировку системы. Первый шаг по выяснению того, что кодирует ваш терминал / система, - это выяснить, какой терминал / система вы используете в первую очередь. Детали, вероятно, находятся в руководстве. Если на терминале нет , используйте UTF-8, тогда вам нужно преобразовать строку UFT-8 в вашу программу в кодировку символов, которую использует терминал - если только эта кодировка не имеет графем которые вы хотите распечатать. К сожалению, стандартная библиотека не обеспечивает поддержку конвертации произвольного символьного кодирования (есть некоторая поддержка для конвертации между узким и широким юникодом, но даже эта поддержка устарела). Здесь вы можете найти стандарт unicode здесь , хотя я хотел бы указать, что использование существующей конверсионной реализации может сэкономить много работы. В случае, если кодировка символа терминала не имеет необходимых графех - или если вы не хотите внедрять преобразование кодирования - это перенастройка терминала для использования UTF-8. Если терминал / система может быть настроен на использование UTF-8, в руководстве должны быть детали.
  2. Вы должны проверить, действительно ли сам шрифт имеет требуемые графемы, просто введя символы в терминал и посмотреть, показывают ли они, как они должны, хотя этот тест также потерпит неудачу, если в терминальной кодировке нет графем, поэтому сначала проверьте это. Руководство вашего терминала должно объяснить, как изменить шрифт, если это необходимо. Тем не менее, я ожидал бы, что üß будет существовать в большинстве шрифтов.
0
ответ дан user2079303 17 August 2018 в 13:19
поделиться
  • 1
    Код - это CGI, выводящий в JSON браузер, отправляющий запрос – Thomas van Hesteren 13 July 2018 в 13:03
  • 2
    @ThomasvanHesteren смотреть править – user2079303 13 July 2018 в 14:40
Другие вопросы по тегам:

Похожие вопросы: