Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.78
Nikfel
 Аватар для Nikfel
55 / 27 / 5
Регистрация: 30.05.2009
Сообщений: 127
02.01.2013, 15:49     Как конвертировать Unicode в Ansi? #1
Я написал свою функцию конвертирования из 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 байта?
Заранее спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
02.01.2013, 16:17     Как конвертировать Unicode в Ansi? #2
Ты тупо копируешь поэлементно строку двухбайтовых символов в строку однобайтовых, выполняя понижающее приведение. Значения теряются.
Nikfel
 Аватар для Nikfel
55 / 27 / 5
Регистрация: 30.05.2009
Сообщений: 127
02.01.2013, 17:43  [ТС]     Как конвертировать Unicode в Ansi? #3
А как разложить строку на все байты, чтобы обрабатывать каждый байт, исключая байт 00?
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
02.01.2013, 21:53     Как конвертировать Unicode в Ansi? #4
попробуй вместо 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, а не наоборот
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
02.01.2013, 22:03     Как конвертировать Unicode в Ansi? #5
Цитата Сообщение от xtorne21st Посмотреть сообщение
попробуй вместо char использовать int;
вообще то int 4 байта
лучше short int
Nikfel,
ты в наглую теряешь первый байт(нулевой) в каждом wchar_t, а там код страны
да и русских кодировок до проха ты в какую конвертить хочешь?
первые два байта показывают тип кодировки
почитай
http://ru.wikipedia.org/wiki/Юникод
сколько разновидностей юникодов
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
02.01.2013, 22:11     Как конвертировать Unicode в Ansi? #6
Цитата Сообщение от ValeryS Посмотреть сообщение
вообще то int 4 байта
лучше short int
У меня int и short занимают одинаково 4 байта.
Avazart
 Аватар для Avazart
6905 / 5145 / 253
Регистрация: 10.12.2010
Сообщений: 22,630
Записей в блоге: 17
02.01.2013, 22:13     Как конвертировать Unicode в Ansi? #7
Цитата Сообщение от Nikfel Посмотреть сообщение
конвертирования из Unicode в Ansi
Есть разный Unicode и разный Ansi
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
02.01.2013, 22:35     Как конвертировать Unicode в Ansi? #8
Цитата Сообщение от xtorne21st Посмотреть сообщение
меня int и short занимают одинаково 4 байта.
вполне возможно ( не противоречит стандарту) я говорил про Win32
Таблица юникоде кодов
http://unicode-table.com/ru/
Nikfel
 Аватар для Nikfel
55 / 27 / 5
Регистрация: 30.05.2009
Сообщений: 127
03.01.2013, 12:38  [ТС]     Как конвертировать Unicode в Ansi? #9
Переписал таким образом, вроде работает. Интересно только в каком случае может не сработать?
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++;
    }
}
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
03.01.2013, 12:42     Как конвертировать Unicode в Ansi? #10
Цитата Сообщение от Nikfel Посмотреть сообщение
Интересно только в каком случае может не сработать?
в случае букв Ё =0х0401 и ё =0х451
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2013, 13:30     Как конвертировать Unicode в Ansi?
Еще ссылки по теме:

ANSI to Unicode C++
ANSI to Unicode C++
Перевод из unicode в ansi и utf8 C++

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

Или воспользуйтесь поиском по форуму:
Nikfel
 Аватар для Nikfel
55 / 27 / 5
Регистрация: 30.05.2009
Сообщений: 127
03.01.2013, 13:30  [ТС]     Как конвертировать Unicode в Ansi? #11
Остановился на таком варианте:
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';
Yandex
Объявления
03.01.2013, 13:30     Как конвертировать Unicode в Ansi?
Ответ Создать тему
Опции темы

Текущее время: 14:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru