Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
4 / 4 / 3
Регистрация: 20.06.2013
Сообщений: 35

Юникод в массиве char и преобразование его в ANSI

22.10.2014, 22:25. Показов 2633. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем!
Есть источники, который возвращает строку из char (это типо информация название данных). Все бы хорошо, но некоторые источники помещают туда юникодные строчки. Я определяю юникодная строчка или ANSI строчка, если там есть сочетание 0xD0, но преобразовать в анси не получается.

Я тут написал краткий пример имитирующий данный случай.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <windows.h>
 
char* UnicodeToAnsi(const wchar_t* unicodeStr);
 
//ИСПОЛНЯЕМАЯ ЧАСТЬ
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    char *result;
    wchar_t *wch1=L"Привет РјРёСЂ!";  //Привет мир!
    char *wch2="Привет РјРёСЂ!";  //Привет мир!
    //Преобразовываем и выводим
 
    result=UnicodeToAnsi(wch1);
    MessageBox(0, result, "Эксперемент 1", MB_OK);
 
    result=UnicodeToAnsi((wchar_t*)wch2);
    MessageBox(0, result, "Эксперемент 2", MB_OK);
 
    return 0;
}
 
char* UnicodeToAnsi(const wchar_t* unicodeStr)
{
    unsigned int ct;
    char *ansiStr;
 
    if (!unicodeStr)
    {
        return 0;
    }
    ct =  wcslen(unicodeStr)+1;
 
    ansiStr = new char[ct*2];
    if (ansiStr==0)
        return 0;
    // Covert to Unicode.
    if (0 == WideCharToMultiByte(CP_ACP, 0, unicodeStr, ct, ansiStr, ct*2, 0, 0))
    {
        delete[] ansiStr;
        return 0;
    }
    return ansiStr;
}
Вот только сообщение Эксперемент 1 выводит правильно (руский текст), а Эксперемент 2 вопросительные знаки. Как сделать преобразование второго эксперемента в ANSI строку?

P.S.
Кажется, что ошибка на виду, а понять не могу=)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.10.2014, 22:25
Ответы с готовыми решениями:

Кодировка Юникод, ANSI
Есть файл с русскими символами с кодировкой Юникод. Открывается Блокнотом. Из VB6 он не читается. Копирую текст вручную в буфер, потом...

Преобразование из int в char в массиве (не обычно)
Прет всем. есть файл с 2 строками 456321 hi man Нужно поставить по индексу типо если первая цифра 4, то берем 4 сивол из строки...

Char *(UTF-8) -> char *(ANSI)
Есть строка в кодировке UTF-8(если не ошибаюсь) типа char * Вот так ее я вижу в MSVC++10 - комментарии(оригинал - комментарии)...

5
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.10.2014, 22:44
Цитата Сообщение от Добрый миломан Посмотреть сообщение
Я определяю юникодная строчка или ANSI строчка, если там есть сочетание 0xD0
0xD0 может быть и там, и там.
А Unicode - понятие широкое, это может быть и UTF-8, и UTF-16/32, еще с
разным порядком байт. Так что не зная, в какой кодировке исходная строка,
можете считать, что строки вообще нет.

Цитата Сообщение от Добрый миломан Посмотреть сообщение
result=UnicodeToAnsi((wchar_t*)wch2);
Это неверно.
wch2 - это char-строка, а функция принимает wchar-строку.

Цитата Сообщение от Добрый миломан Посмотреть сообщение
C++
1
2
ansiStr = new char[ct*2];
if (ansiStr==0)
И это неверно. new бросает иключение в случае ошибки,
так что проверять на 0 уже поздно.

И вообще, правильно так: вызвать WideCharToMultiByte два раза,
на первом определив необходимый размер буфера, а на втором
выполнив преобразование.

Добавлено через 3 минуты
Цитата Сообщение от Добрый миломан Посмотреть сообщение
Все бы хорошо, но некоторые источники помещают туда юникодные строчки.
Я бы сказал, что это не просто хорошо, а удивительно хорошо !
Всякие ANSI и кодовые страницы давно пора забыть как страшный сон.
1
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
22.10.2014, 22:54
Не знаю поможет ли, но вот из UTF в ANSI:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int Utf8ToAnsi(char *utfstr)
{
    memset(abuf,0,_countof(abuf));
    //norm - входная строка
    //szUtf- выходная
    WCHAR wszTemp[1500] = {0};
    INT iSize = 0;
    INT iMBS = 0;
    iSize = MultiByteToWideChar(CP_UTF8, 0, utfstr, -1, NULL, 0);
    if(iSize <= 0)
        return -1;
    EC = MultiByteToWideChar(CP_UTF8, 0, utfstr, -1, wszTemp, iSize);
    if(EC <= 0)
        return -2;
    iMBS = WideCharToMultiByte(CP_ACP,  0, wszTemp, iSize, NULL, 0, NULL, NULL); 
    if(iMBS <= 0)
        return -3;
    EC = WideCharToMultiByte(CP_ACP,  0, wszTemp, iSize, abuf, iMBS, NULL, NULL);
    if(EC <= 0)
        return -4;
    return 0;
}
1
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
22.10.2014, 22:56
Цитата Сообщение от Добрый миломан Посмотреть сообщение
Я определяю юникодная строчка или
есть куча юникодов и по правильному сначала идет идентификатор

https://ru.wikipedia.org/wiki/Юникод
Порядок байтов
1
4 / 4 / 3
Регистрация: 20.06.2013
Сообщений: 35
23.10.2014, 00:35  [ТС]
Спасибо всем! Вопрос снят
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
23.10.2014, 00:52
Добрый миломан,
я только сейчас заметил
ссылка потерялась

r u.wikipedia.org/wiki/Юникод
опять не видно )
короче статья в википедии Юникод
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.10.2014, 00:52
Помогаю со студенческими работами здесь

char* & Юникод
использую чужую ДЛЛ которая выдает подписи(надписи) для разных языков но возвращает она значение в char* а у меня программа в Юникоде ...

Ansi String в UNSIGNED char
Доброго времени суток. Надо преобразовать Ansi String в unsigned char. В обычный char преобразуется без проблем, а вот в unsigned...

Функция для преобразование строки в юникод
Подскажите функцию на javascript, к-рая будет преобразовывать строку в последовательность юникод-символов. Например, получает строку...

Помогите char* или ansi в wchar_t*
Доброго времени суток Всем. Возникла такая проблема, у меня в в функцию передаётся значение в char*, мне нужно перевести значение в...

Преобразование ANSI->Unicode
Задача такая: есть входной текстовый файл, нужно изменить кодировку на unicode и записать в выходной. Не могу сообразить, как записывать в...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru