Могу ли я расшифровать € (знак евро) как char, а не как wstring / wchar?

Попробуем объяснить мою проблему. Мне нужно получить сообщение с сервера (запрограммированного в delphi) и сделать некоторые вещи с этим сообщением на стороне клиента (это сторона, которую я программирую на C ++).

  1. Скажем, сообщение: "Hello €", это означает, что мне нужно работать с std::wstring, поскольку (знак евро) требуется 2 байта вместо 1, поэтому зная, что я выполнил всю свою работу с wstrings, и если я установил сообщение, он работает отлично. Теперь я должен получить настоящий с сервера, и здесь возникает проблема.

  2. Человек на стороне сервера отправляет это сообщение в виде строки. Он использует функцию EncodeString () в delphi и говорит, что не собирается ее менять. Итак, мой вопрос: если я декодирую эту строку в строку в C ++, а затем конвертирую ее в строку wstring, это сработает? Или у меня будут проблемы и в моей строке var вместо "Hello €" будет другое сообщение.

  3. Если да, то если я могу получить эту строку без проблем, то у меня другая проблема. Функция, которую я должен использовать для декодирования строки, void DecodeString(char *buffer, int length);

поэтому обычно, если вы получаете текст, вы делаете что-то вроде:

char Text[255];
DescodeString(Text, length); // length is a number  decoded before

Итак ... могу ли я без проблем его расшифровать и получить в Text сообщение "Hello €"? с этим мне просто нужно преобразовать его и получить wstring.

Спасибо

РЕДАКТИРОВАТЬ:

Добавлю еще один пример. Если я знаю, что сервер всегда будет отправлять мне текст длиной не более 30, на сервере они делают что-то вроде:

EncodeByte(lengthText);
EncodeString(text)

а в клиенте вы делаете:

 int length;
 char myText[30];

 DecodeByte(length);
 DecodeString(myText,length);

а затем вы можете работать с myText как со строкой в ​​последнее время.

Надеюсь, это поможет еще немного. Прошу прощения за то, что у меня нет дополнительной информации, но я новичок в этой работе и мало что знаю о сервере.

ИЗМЕНИТЬ 2

Попытка резюмировать ... Дело в том, что я должен получить сообщение и что-то с ним сделать, с помощью инструмента, который, как я сказал, я должен его расшифровать. Так как de DecodeString () нужен char, а мне нужна wstring, мне просто нужен способ получить данные, полученные сервером, декодировать их с помощью decodeString () и передать их в wstring, но я действительно не знаю, это возможно, и если это так, я не уверен, как это сделать и какие типы варов используются для его получения

ИЗМЕНИТЬ 3

Наконец-то! Я знаю, какие кодовые страницы используются. Кажется, что клиент использует ANSI, а сервер - нет, так что ... Я должен сказать человеку, который выполняет эту часть, чтобы он изменил его на ANSI. Спасибо всем за помощь в моем большом незнании о существовании кодовых страниц.


person Megasa3    schedule 08.09.2015    source источник
comment
Если вы хотите использовать однобайтовые символы (например, в C и C ++), вы можете использовать их и просто кодировать строки в UTF-8 или использовать Ansi с кодовой страницей со знаком евро. Я бы проголосовал за UTF-8.   -  person Rudy Velthuis    schedule 08.09.2015
comment
@RudyVelthuis Если я вас хорошо понимаю, вы хотите изменить мою функцию DecodeString (). Я забыл сказать, что предполагается, что я должен работать с ним, не меняя эту функцию (решение моего босса :()   -  person Megasa3    schedule 08.09.2015
comment
Вы должны понять, как кодируется текст. Вы знаете?   -  person David Heffernan    schedule 08.09.2015
comment
@DavidHeffernan Я знаю, что они отправляют его, как раньше, с любым другим текстом, поэтому я поместил этот небольшой код о том, как он должен быть декодирован.   -  person Megasa3    schedule 08.09.2015
comment
Нет, вам не хватает важной информации. Как кодируется текст? Если вы не знаете, что такое кодировка текста, вам нужно провести небольшое исследование, прежде чем вы сможете добиться прогресса.   -  person David Heffernan    schedule 08.09.2015
comment
Можете ли вы просто попытаться получить сообщение с сервера в виде массива байтов (т.е. без декодирования) и посмотреть, как закодирован знак евро? Вы также можете опубликовать этот массив байтов здесь, чтобы мы могли вам посоветовать.   -  person Petr    schedule 08.09.2015
comment
Да, это было бы началом. Вы, вероятно, обнаружите, что код Delphi использует системную локаль, и пока вы знаете кодовую страницу ANSI сервера, все будет в порядке. Кто бы ни принимал решения в этом проекте, нужно проверить свою голову!   -  person David Heffernan    schedule 08.09.2015
comment
@DavidHeffernan Я знаю, что такое кодирование и декодирование, я только что добавил правку в свой пост. Дело в том, что я новичок в этой работе, и они просто сказали мне, что я должен использовать DecodeString, которому нужны бафф char * и длина, и напарник, который программировал сторону serverd, сказал, что его часть в порядке, и ничего более   -  person Megasa3    schedule 08.09.2015
comment
@Petr Я не знаю, как это увидеть, но я попробую, дай мне время посмотреть ....   -  person Megasa3    schedule 08.09.2015
comment
Поверьте, вам нужно узнать о кодировке текста. Как вы сказали, вы новичок, и вы этого не знаете. Что ж, я знаю, что тебе нужно знать. Вам необходимо изучить и понять кодировки текста. Это твоя следующая задача.   -  person David Heffernan    schedule 08.09.2015
comment
Почему вы хотите преобразовать данные Unicode в кодовую страницу ASCII? Это просто вызывает проблемы - если ваше приложение не использует конкретную жестко запрограммированную кодовую страницу для ввода / вывода, почти гарантировано, что данные в какой-то момент будут искажены. Кроме того, какие кодовые страницы вы бы использовали?   -  person Panagiotis Kanavos    schedule 08.09.2015
comment
Разве ваше char Text[255]; не в точности получено байтовым сообщением? Просто напечатайте каждый элемент как int, а не как char.   -  person Petr    schedule 08.09.2015
comment
PS - Знак евро был добавлен в 1998 году. Старые кодовые страницы, такие как 437 и 850, не содержат этот символ. Например, 858 должен был заменить 850, который заменил ı на €. Вам необходимо убедиться, что используется соответствующая кодовая страница.   -  person Panagiotis Kanavos    schedule 08.09.2015
comment
видеть? кодовая страница была чем-то, о чем я не знал. Я только что узнал кое-что новое! ты! Попытка резюмировать ... Дело в том, что я должен получить сообщение и что-то с ним сделать, с помощью инструмента, который, как я сказал, я должен его расшифровать. Так как de DecodeString () нужен char, а мне нужна wstring, мне просто нужен способ получить приемник данных от сервера, декодировать его с помощью decodeString () и получить его в wstring.   -  person Megasa3    schedule 08.09.2015
comment
@Petr нет, char Text[255]; - это переменная, объявленная в .h, поэтому в .cpp я могу использовать функцию decodeString. это еще не полученные данные   -  person Megasa3    schedule 08.09.2015
comment
Вы не слушаете. Вы не можете декодировать двоичный файл в текст, не зная кодовой страницы. Спросите того, кто отправляет данные, рассказать вам, какая кодовая страница задействована. Если они не скажут вам, подумайте о поиске работы получше.   -  person David Heffernan    schedule 08.09.2015
comment
@DavidHeffernan, я пытался получить эти ответы. Я их спросил, а они не знают. Они просто говорят, что если код работает, то все в порядке, и мне просто нужно использовать этот decodestring (), получить массив символов и работать с ним .... uu Я ненавижу эту логику: если она работает, не надо спрашивайте, не пытайтесь узнать или понять, просто заставьте это работать ...   -  person Megasa3    schedule 08.09.2015
comment
Хорошо, я сказал все, что собираюсь здесь сказать. Теперь все кончено.   -  person David Heffernan    schedule 08.09.2015
comment
@DavidHeffernan, хорошо, всем, я постараюсь понять все это лучше. Небольшой вопрос? ты расстроен? : S Потому что я не хотел, поверьте, что я стараюсь изо всех сил ...   -  person Megasa3    schedule 08.09.2015
comment
Я совсем не расстроен. Сочувствую вам. Но время ограничено. Я сказал то, что, как мне кажется, нужно сказать, и это нормально. Удачи. Убедитесь, что ваше резюме в хорошей форме, на случай если вы заметите возможность работы с более здравомыслящими разработчиками!   -  person David Heffernan    schedule 08.09.2015
comment
хорошо, спасибо @DavidHeffernan! Я знаю, что знаю, надеюсь, я найду еще одну, ха-ха. Теперь я читаю о кодовых страницах, чтобы узнать, могу ли я просто предположить, что они используют то же самое или нет и т. Д.   -  person Megasa3    schedule 08.09.2015
comment
@PanagiotisKanavos Я пытаюсь понять, что такое именно кодовые страницы, но ... вам нужен только номер или регион? Я имею в виду ... Я работаю с испанскими буквами (ñáéíïÜ ...), это помогает или мне нужно выяснить точное число?   -  person Megasa3    schedule 08.09.2015
comment
Вы должны использовать Unicode, чтобы правильно обрабатывать все символы, а не только символ евро. Ваше приложение C ++ должно использовать wstring, а приложение Delphi должно использовать WideString (если оно создано в старой версии) или string / UnicodeString, если сделано в D2009 или новее. Однако возможно, что приложение Delphi отправляет UTF8 (кодировку Unicode) или строку, закодированную с кодовой страницей ANSI, что, как было сказано выше, означает, что вам необходимо знать кодовую страницу, чтобы правильно декодировать ее в строку Unicode wstring. Краткий ответ: спросите разработчиков еще раз, примите только исчерпывающий ответ. И обновите свои Delphi;)   -  person David    schedule 08.09.2015
comment
Также начните с этого - хорошего введения: joelonsoftware.com/articles/Unicode.html   -  person David    schedule 08.09.2015
comment
Насколько я знаю, все текущие операционные системы имеют функцию преобразования кодировки, почему бы просто не использовать ее? И € не совсем 2 байта. Это зависит от кодировки и ширины каждого символа. Например, если sizeof(wchar_t) составляет 4 байта (скорее всего, в Linux / Unix), тогда € занимает 4 байта, исключая заголовок и т. Д. Если он хранится как UTF-8, он занимает 3 байта E2 82 AC. Вы можете преобразовать его в 1 байт, если есть однобайтовая кодировка, содержащая этот символ, но это маловероятно и затруднит совместимость с другими приложениями, поскольку все операционные системы уже используют Unicode.   -  person phuclv    schedule 08.09.2015
comment
@DavidM, предположим, что это utf8 (пока они не сообщают мне больше информации), что мне теперь делать? Если я делаю что-то вроде std:wstring str = L"Hello €";, то я разбираю евро в поисках буквы за буквой и сравниваю с L'\x20AC, и это работает (не знаю, может ли это в чем-то помочь). Я получил 20Ac отсюда fileformat.info/info/unicode/char/20ac/index.htm   -  person Megasa3    schedule 08.09.2015
comment
Вам нужно декодировать двоичный код в кодировке utf8 в текст. Здесь об этом много раз говорилось. Например, http://stackoverflow.com/questions/14601413/cross-platform-way-to-convert-utf8-to-stdwstrin Но разве у вас нет опытных коллег, которые могли бы вам помочь? Разве у вас нет библиотек, с которыми работает ваш код. Вы действительно единственный программист в своей команде?   -  person David Heffernan    schedule 08.09.2015
comment
@DavidHeffernan нет, я не единственный, но тех, кто знает эту информацию, сегодня здесь нет. Похоже, мне придется подождать до завтра, чтобы спросить их еще раз и получить правильный ответ.   -  person Megasa3    schedule 08.09.2015
comment
Я подозреваю, что если вы продолжите, вы чему-то научитесь, но в конечном итоге вы можете заново реализовать (возможно, неправильно) то, что уже существует в вашей кодовой базе.   -  person David Heffernan    schedule 08.09.2015
comment
Какая кодовая страница ANSI? Здесь очень много.   -  person David Heffernan    schedule 08.09.2015
comment
@DavidHeffernan Я пытаюсь понять, какой ... он сказал мне, может ли это быть 0409 в шестнадцатеричном формате ... английский из США (который, я надеюсь, там есть такие вещи, как á é ï ñ ...)   -  person Megasa3    schedule 09.09.2015
comment
Я бы ожидал такой кодовой страницы, как 1252, которая является английской кодовой страницей ANSI. 2015 год. Никто не должен использовать ANSI. Мы сделали это, потому что в Windows 98 у нас не было выбора.   -  person David Heffernan    schedule 09.09.2015
comment
@DavidHeffernan Я до сих пор не знаю, какая кодовая страница использует сервер (я узнаю это завтра или в понедельник), НО как сейчас, если я получаю сообщение Hello… я получаю: Hello \ 200 á ‹неполный последовательность - ›... вы знаете, какая это может быть кодовая страница? Я просмотрел так много кодовых страниц, если pos 200 - это €, но ничего не найдено ... (я не знаю, означает ли это \ 200, что € - это номер 200 кодовой страницы, но я предполагал это)   -  person Megasa3    schedule 09.09.2015
comment
Мы могли бы предположить, прекратите ли вы попытки декодировать текст и просто покажете нам двоичный файл.   -  person David Heffernan    schedule 09.09.2015
comment
Пожалуйста, покажите шестнадцатеричные значения всей строки. Также, если это UTF8 - отлично! Расшифруйте его в строку, и все готово.   -  person David    schedule 10.09.2015


Ответы (1)


Поскольку вы используете wstring, я предполагаю, что вы работаете в Windows (wstring не популярен в * nix).

Если это так, вам нужно, чтобы приложение Delphi отправляло вам UTF-16, который вы можете использовать в конструкторе wstring. Пример:

char* input = "\x0ac\x020"; // UTF-16 encoding for euro sign
wchar_t* input2 = reinterpret_cast<wchar_t*>(input);
wstring ws(input2);

Если вы Linux / Mac и т. Д., Вам необходимо получить UTF-32.

Однако этот метод далек от совершенства. Могут быть подводные камни и крайние случаи для юникодов за пределами 0xffff (китайский и т. Д.). Для этого, вероятно, потребуется докторская степень.

person Lasse Reinhold    schedule 08.09.2015
comment
ммм, я не знал, что wstring были для окон ... Я работаю над ОС Unix, над eclipse. Я использую wstring, потому что раньше у меня была другая проблема со знаком €, и я обнаружил, что не могу использовать с ним строку, но wstring была решением. Моя основная проблема заключалась в том, чтобы его расшифровать (что я все еще пытаюсь) - person Megasa3; 08.09.2015
comment
wstring поддерживается в * nix, просто его не очень популярно использовать, потому что многие методы API принимают в качестве входных данных utf-8 (char * или std :: string). Но просто попросите парня Dephi предоставить вам UTF-32, и все вышеперечисленное должно сработать. - person Lasse Reinhold; 08.09.2015
comment
ну, проблема в том, что, как я сказал в комментариях к моему вопросу, этот «парень» отказывается вносить какие-либо изменения, поэтому я должен был посмотреть, смогу ли я сделать эту работу каким-либо образом .... много раз мне приходилось демонстрировать, что Я доказал все разумные и безумные методы, чтобы дать им понять, что они должны внести изменения, прежде чем они мне поверят :( - person Megasa3; 08.09.2015