Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/79: Рейтинг темы: голосов - 79, средняя оценка - 4.63
 Аватар для Nikfel
60 / 32 / 15
Регистрация: 30.05.2009
Сообщений: 234

Как конвертировать Unicode в Ansi?

02.01.2013, 15:49. Показов 15491. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я написал свою функцию конвертирования из Unicode в Ansi, но она не правильно кодирует символы русского языка.
Как такое исправить?

C++
1
2
3
4
5
6
7
8
9
10
void WideToChar(wchar_t *strS, char *strText)
{
    wchar_t *p = strS;
    char *p1 = strText;
    while (*p) {
        *p1 = (char) *p;
        p1++;
        p++;
    }
}
Проверка переполнения буфера отсутствует, так что аккуратнее с этой функцией.
Меня интересует почему так происходит при русских символах или это из-за того что символы юникода занимают 2 байта?
Заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.01.2013, 15:49
Ответы с готовыми решениями:

Unicode, UTF-8 и ANSI в одном консольном приложении. Можно ли "на лету" конвертировать массив строк?
Всем доброго дня) Подскажите такую весчь: можно ли в консольном приложении работать с несколькими кодировками? Нужно считать файлик в...

Как конвертировать строку из Unicode GB2312
Знаний как таковых в С++ нет, а хочется на ардуине проект запустить. К примеру есть текст Если использовать онлайн декодер, то...

ANSI to Unicode
Всем доброго времени суток! Есть задачка преобразовать строку в cp1251 в строку в unicode и сохранить ее в файл в кодировке unicode...

11
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
02.01.2013, 16:17
Ты тупо копируешь поэлементно строку двухбайтовых символов в строку однобайтовых, выполняя понижающее приведение. Значения теряются.
0
 Аватар для Nikfel
60 / 32 / 15
Регистрация: 30.05.2009
Сообщений: 234
02.01.2013, 17:43  [ТС]
А как разложить строку на все байты, чтобы обрабатывать каждый байт, исключая байт 00?
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
02.01.2013, 21:53
попробуй вместо char использовать int; в случаи успеха и обращения у тебя будет автоматическое приведение типов.

Добавлено через 30 минут
А вообще в <stdlib.h> объявлена функция mbstowcs(). Вот её прототип:
C++
1
size_t mbstowcs(wchar_t *dest, const char *src, size_t n);
Из описания Шилдт спавочник С:
Функция mbstowcs() преобразует многобайтовую строку, адресуемую параметром in, в строку, состоящую из двухбайтовых символов, и помещает результат в массив, адресуемый параметром out. В массиве out будет сохранено в памяти только size байтов.
В версии С99 к параметрам out и in применен квалификатор restrict.
Функция mbstowcs() возвращает количество преобразованных многобайтовых символов. При возникновении ошибки функция возвращает значение -1.


Добавлено через 7 минут
ПС. Информация не актуальна, так как приводиться преобразование в wchar_t, а не наоборот
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,868
02.01.2013, 22:03
Цитата Сообщение от xtorne21st Посмотреть сообщение
попробуй вместо char использовать int;
вообще то int 4 байта
лучше short int
Nikfel,
ты в наглую теряешь первый байт(нулевой) в каждом wchar_t, а там код страны
да и русских кодировок до проха ты в какую конвертить хочешь?
первые два байта показывают тип кодировки
почитай
http://ru.wikipedia.org/wiki/Юникод
сколько разновидностей юникодов
1
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
02.01.2013, 22:11
Цитата Сообщение от ValeryS Посмотреть сообщение
вообще то int 4 байта
лучше short int
У меня int и short занимают одинаково 4 байта.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.01.2013, 22:13
Цитата Сообщение от Nikfel Посмотреть сообщение
конвертирования из Unicode в Ansi
Есть разный Unicode и разный Ansi
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,868
02.01.2013, 22:35
Цитата Сообщение от xtorne21st Посмотреть сообщение
меня int и short занимают одинаково 4 байта.
вполне возможно ( не противоречит стандарту) я говорил про Win32
Таблица юникоде кодов
http://unicode-table.com/ru/
0
 Аватар для Nikfel
60 / 32 / 15
Регистрация: 30.05.2009
Сообщений: 234
03.01.2013, 12:38  [ТС]
Переписал таким образом, вроде работает. Интересно только в каком случае может не сработать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void WideToChar(wchar_t *strS, char *strText)
{
    const wchar_t minRus = 0x0410;//первый русский символ Unicode
    const wchar_t maxRus = 0x044f;//последний русский символ Unicode
    const char minR = 192;//первый русский символ Ansi
    int i = 0;
    wchar_t *p = strS;
    char *p1 = strText;
    while (*p) {
        if (*p >= minRus && *p <= maxRus) {i = *p - minRus; *p1 = minR + i;} else *p1 = (char) *p;
        p1++;
        p++;
    }
}
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,868
03.01.2013, 12:42
Цитата Сообщение от Nikfel Посмотреть сообщение
Интересно только в каком случае может не сработать?
в случае букв Ё =0х0401 и ё =0х451
1
 Аватар для Nikfel
60 / 32 / 15
Регистрация: 30.05.2009
Сообщений: 234
03.01.2013, 13:30  [ТС]
Остановился на таком варианте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void WideToChar(wchar_t *strS, char *strText)
{
    const wchar_t minRus = 0x0410;
    const wchar_t maxRus = 0x044f;
    const wchar_t eRus = 0x0401;
    const wchar_t e1Rus = 0x0451;
    const char e1 = 168;
    const char e2 = 184;
    const char minR = 192;
    int i = 0;
    wchar_t *p = strS;
    char *p1 = strText;
    while (*p) {
        if (*p == eRus) *p1 = e1; else if (*p == e1Rus) *p1 = e2; else
            if (*p >= minRus && *p <= maxRus) {i = *p - minRus; *p1 = minR + i;} else *p1 = (char) *p;
        p1++;
        p++;
    }
}
Добавлено через 26 минут
после 18 строки надо вставить символ конца строки:
C++
1
*p1 = '\0';
0
0 / 0 / 0
Регистрация: 10.11.2017
Сообщений: 4
10.11.2017, 22:04
Может немного не в тему, но прежде перелопатил гугл как только мог. Знаний как таковых в С++ нет, а хочется на ардуине проект запустить.
К примеру есть текст
§б§в§Ъ§Ю§Ц§в §д§Ц§Ь§г§д§С
Если использовать онлайн декодер, то показывает кодировку GB2312.
Не могу понять как использовать функцию выше для расшифровки этого текста, может поможете примерами в выводом в Serial?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.11.2017, 22:04
Помогаю со студенческими работами здесь

ANSI и UNICODE
#include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; int main(){ TCHAR j; return 0;

ANSI to Unicode
Hi all. Вопрос к экспертам :) Хочу сохранить строку текста (кириллица) в текстовый файл. Строка в ANSI, а нужно сконвертировать в...

Перевод из Unicode в ANSI
Привет! При переводе из Unicode в ANSI юзаю вот эти две функции: CharToOemW и OemToCharA. Первая переводит из Unicide в Oem, а вторая - из...

Unicode and ANSI string
Есть следующий код: #include&lt;Windows.h&gt; #include&lt;tchar.h&gt; #include&lt;iostream&gt; int main() { std::cout &lt;&lt;...

Перевести Unicode строку в ANSI
char label_ansi; wchar_t label_wide; sprintf_s (label_ansi, &quot;%ls&quot;, label_wide); // работает, но если и когда появляется не-ascii...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru