WideString wstr;
// Получаем текст Unicode, пихаем в wstr
AnsiString astr = wstr; // Получаем соответствующий текст в ANSI
Преобразование кодировок наверно
Возникла такая проблема. Занялся чтением СМС-ок, полученных GSM-модемом. Проблема в том что GSM-модем не очень понимает русские буквы в СМС-ках. Поэтому он возвращает мне текст русской СМС-ки в виде шестнадцатиричных кодов. Например русская маленькая буква "л" возвращается в виде строки "043B" (соответствие можно посмотреть в стандартной Windows-утилите "Набор символов"). А раз эта кодировка есть в этой утилите, значит это какая-то стандартная кодировка.
Вопрос такой, как такую кодировку перевести в нормальные символы?
Заранее спасибо!
P.S. поиском ничего полезного не нашел.
P.P.S. Задам вопрос более конкретно: как преобразовать из кодировки Юникод в кодировку ASCII
Код:
Цитата: el scorpio
Код:
WideString wstr;
// Получаем текст Unicode, пихаем в wstr
AnsiString astr = wstr; // Получаем соответствующий текст в ANSI
// Получаем текст Unicode, пихаем в wstr
AnsiString astr = wstr; // Получаем соответствующий текст в ANSI
точнее
Код:
WideString wstr;
// Получаем текст Unicode, пихаем в wstr
AnsiString astr = WideCharToString(wstr); // Получаем соответствующий текст в ANSI
// Получаем текст Unicode, пихаем в wstr
AnsiString astr = WideCharToString(wstr); // Получаем соответствующий текст в ANSI
Вобщем попробовал я вышеописанный вариант - не работает, но направление подсказано правильное. Но сколько я ни бился - ничего не получилось.
Задача сводится к следующему: есть строка типа AnsiString, содержащая некий текст в кодировке Unicode. Выглядит она например так: "043404430448", что в переводе на русский означает слово из трех букв "душ".
Как мне сделать сию перекодировку?
P.S. Только не надо предлагать вариант делить строку на части по 4 символа в каждой, составить в программе таблицу соответствия и соответственно выбирать что чему соответствует. Этот вариант я оставил на крайний случай :)
Цитата: Borgir
Извиняюсь что так долго молчал - были проблемы с инетом.
Вобщем попробовал я вышеописанный вариант - не работает, но направление подсказано правильное. Но сколько я ни бился - ничего не получилось.
Задача сводится к следующему: есть строка типа AnsiString, содержащая некий текст в кодировке Unicode. Выглядит она например так: "043404430448", что в переводе на русский означает слово из трех букв "душ".
Как мне сделать сию перекодировку?
P.S. Только не надо предлагать вариант делить строку на части по 4 символа в каждой, составить в программе таблицу соответствия и соответственно выбирать что чему соответствует. Этот вариант я оставил на крайний случай :)
Вобщем попробовал я вышеописанный вариант - не работает, но направление подсказано правильное. Но сколько я ни бился - ничего не получилось.
Задача сводится к следующему: есть строка типа AnsiString, содержащая некий текст в кодировке Unicode. Выглядит она например так: "043404430448", что в переводе на русский означает слово из трех букв "душ".
Как мне сделать сию перекодировку?
P.S. Только не надо предлагать вариант делить строку на части по 4 символа в каждой, составить в программе таблицу соответствия и соответственно выбирать что чему соответствует. Этот вариант я оставил на крайний случай :)
Варианта два - или таблица соответствия или использование WideString
. Як то казали давні латиняни - tercium non datum (прошу прощения за возможные ошибки - латынь учил лет 12 назад). :)
Ну я согласен на использование WideString. Подскажите только как мне из AnsiString запихнуть данные в WideString? Потому что насколько я понял функция StringToWideChar осуществляет кодировку строки в Юникод, а мне по-сути надо запихнуть строку в WideString без кодировки, а уже потом эту WideString раскодировать с помощью WideCharToString.
Очень легко - использованием оператора присваивания :D
Дело в том, что у обоих типов есть конструкторы __fastcall WideString (const AnsiString& src) и __fastcall AnsiString (const WideString &src).
По-этому когда выполняется присваивание, то автоматически вызывается конструктор с соответствующим параметром:
Код:
// Мы пишем код
aStr = wStr; // AnsiString = WideString
// А компилятор разворачивает его в последовательность команд
aStr.operator= (AnsiString::AnsiString (/*const WideString&*/wStr));
aStr = wStr; // AnsiString = WideString
// А компилятор разворачивает его в последовательность команд
aStr.operator= (AnsiString::AnsiString (/*const WideString&*/wStr));
Посему нет нужды заморачиваться какими либо функциями преобразования. Особо WideCharToString и прочими "указательными" анахронизмами.