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

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

22.10.2014, 22:25. Показов 2653. Ответов 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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
22.10.2014, 22:56
Цитата Сообщение от Добрый миломан Посмотреть сообщение
Я определяю юникодная строчка или
есть куча юникодов и по правильному сначала идет идентификатор

https://ru.wikipedia.org/wiki/Юникод
Порядок байтов
1
4 / 4 / 3
Регистрация: 20.06.2013
Сообщений: 35
23.10.2014, 00:35  [ТС]
Спасибо всем! Вопрос снят
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru