Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700

Функция MultiByteToWideChar

08.10.2017, 11:24. Показов 3256. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не понятно почему первый параметр функции MultiByteToWideChar требует кодировку (насколько я понимаю, это кодировка исходной строки). Все равно там просто копируются байты из одного массива в другой. Тогда какое значение здесь имеет кодировка? Кодировка же играет роль только при выводе чтоб система отображения знала в каком виде показать эти байты, какие графические символы подставлять для конкретного набора байт. Думаю в контексте копирования байт это лишний параметр. Тот же аналог этой функции из стандартной библиотеки std::mbstowcs не требует кодировки. В чем подвох?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.10.2017, 11:24
Ответы с готовыми решениями:

MultiByteToWideChar подскажите
Не могу понять как правильно использовать функцию MultiByteToWideChar. Помогите ктонить. К примеру (C++ RAD STUDIO XE7) char charr =...

Функция поиска в массиве и указатели + функция сортировки и поиск найденного элемента
Написать функцию поиска максимального элемента, передать в неё указатель на начало и конец поиска и возвращать указатель на найденный...

Перегрузка операций: friend-функция или функция-член класса
Здравствуйте, меня интересует вопрос, в чем разница при перегрузке операторов через operator и friend. Вот к примеру такой код. class...

11
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
08.10.2017, 11:46
Кодировка же играет роль только при выводе
Да? Ну ладно. Тогда объяснять дальше не имеет смысла.
В чем подвох?
В том, что Вы ничего не знаете о кодировках и их преобразованиях?
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
08.10.2017, 13:27
Цитата Сообщение от Undisputed Посмотреть сообщение
Тот же аналог этой функции из стандартной библиотеки std::mbstowcs не требует кодировки.
Требует. Кодировка задается текущей локалью.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.10.2017, 17:47  [ТС]
Croessmah,
Ну ок ещё чтоб длину строки правильно посчитать например. Зачем нужна кодировка чтоб скопировать байты из массива в другой массив?

Кодировка это просто таблица символов где каждому символу соответствует определенный набор байт. Зачем нужно указывать при копировании исходную кодировку - не понятно.

DrOffset,
Не знал, спасибо! Но что это даёт в контексте копирования байт?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
08.10.2017, 17:59
Undisputed, и где здесь прямое копирование?
Широкие строки и мультибайтные - это разные вещи.
Кодировка это просто таблица символов где каждому символу соответствует определенный набор байт. Зачем нужно указывать при копировании исходную кодировку - не понятно.
И в разных кодировках эти "наборы байт" разные.
Но что это даёт в контексте копирования байт?
Причем здесь копирование байт?
Ну попробуй строку 1251CP или UTF-8 скопировать напрямую в wchar_t.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.10.2017, 18:10  [ТС]
Croessmah,
Ну получить ахинею это в принципе нормально же. Сменили кодировку - этим байтам уже соответствуют другие символы.
Причём это может быть не всегда... Например при переводе из ascii в utf-8 никакой ахинеи быть не должно...

Я понял что ты имеешь ввиду но тут снова возникают вопросы:
1. Какой смысл переводить данные в другую кодировку если мы хотим сохранить их прежнее представление? Ведь у нас уже есть нужное представление так зачем менять кодировку?
2. В указанной функции можно указать только одну кодировку (насколько я понял, это кодировка исходной строки), но для кодировки новой строки нет параметра. Зачем? В какой кодировке в таком случае будет новая строка?

Поэтому и непонятно... Есть набор байт и и помоему для их копирования в новый массив никакие кодировки не нужны... А как работать с этим набором байт уже должны решать конкретные функции для работы со строками. Например strlen(bytes, codepage), и пусть считает сколько символов соответствует переданному набору байт в той кодировке что мы указали вторым параметром...
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
08.10.2017, 18:21
Например при переводе из ascii в utf-8 никакой ахинеи быть не должно..
Ровно до тех пор, пока старший бит равен нулю.
но для кодировки новой строки нет параметра
Потому что в Windows для широких символов используется UCS-2 (или UTF-16?).
. Есть набор байт и и помоему для их копирования в новый массив никакие кодировки не нужны...
Предлагаю решить задачу.
У тебя есть char-символ с кодом 255.
Переведи его в UTF-16 Unicode.
Как решишь, напиши код этого символа в UTF-16.
Затем продолжим обсуждение.
До тех пор, смысла не вижу, стоило бы сначала
ознакомиться с кодировками и с чем их едят.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.10.2017, 18:27  [ТС]
Croessmah,
Говоря "переведи его" - имеется ввиду сохранить графическое представление, но в другой кодировке?

Добавлено через 1 минуту
А если у меня не windows и используется стандартная функция а не та что из winapi?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
08.10.2017, 18:31
Говоря "переведи его" - имеется ввиду сохранить графическое представление, но в другой кодировке?
Глиф зависит от шрифта. Кодировки здесь ни при чем.
Вот естт символ с кодом 255 в какой-то кодовой странице.
Дай мне код этого символа в юникоде.
А если у меня не windows и используется стандартная функция а не та что из winapi?
Под линуксом, например, wchar_t будет UTF-32 (UCS-4).
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.10.2017, 18:41  [ТС]
Croessmah,
Под линуксом wchar_t вроде 4 байта, это же просто тип, никак не связанный с понятием "кодировка"...
Не могу найти логику в том как тип из 4 байт связан с кодировкой... Это просто 4 байта же... В них же нет доп. информации о кодировке.

Вот это мне не понятно... А про ту функцию я понял, она задаст тот набор байт который соответствует переданным символам но уже в UTF16
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
08.10.2017, 20:11
Лучший ответ Сообщение было отмечено Undisputed как решение

Решение

Цитата Сообщение от Undisputed Посмотреть сообщение
В них же нет доп. информации о кодировке.
Она есть у программиста. Когда ты, например, пишешь в char[] строки в CP1251, только ты знаешь, что там лежит именно CP1251. И функции, которые будут принимать такой char [], должны либо непосредственно интерпретировать его как CP1251 (закладываться на это сразу), либо иметь какой-то способ указания. Но в любом случае за корректностью и соответствием одного другому следит именно программист. Если ты передашь в такую функцию KOI8-R или UTF-8, которые также сохраняются в char[] - алгоритмы, ждущие CP1251, перестанут выдавать корректный результат. Поэтому тут так часты, например, темы с "иероглифами" вместо ожидаемого текста - люди не понимают как обеспечить соответствие.
А с wchar_t под windows, ровно как и под linux, просто действует умолчание, договоренность, что в них лежит UTF16/UTF32 соответственно. Т.е. это опять соглашение на уровне программиста\программистов.

Добавлено через 6 минут
Цитата Сообщение от Undisputed Посмотреть сообщение
Но что это даёт в контексте копирования байт?
Там не просто копирование, а преобразование одних кодов в другие.
Например процесс конвертации русской буквы А в кодировке CP1251 в кодировку KOI8-R состоит в нахождения соответствия коду 0xC0 (CP1251) кода 0xE1 (KOI8-R) и запись его в строку-приемник. С преобразованиями других кодировок в общем случае действует тот же принцип.
3
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
11.10.2017, 07:10  [ТС]
DrOffset,
Спасибо что разжевал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.10.2017, 07:10
Помогаю со студенческими работами здесь

Функция удаления текста в скобках [2], непосредственно функция + 12кб вложений
Доброго времени суток, случилось так, что пришлось работать с с-строками (лаба, угу), в которой нужно удалить весь текст в скобках,...

Функция sqrt: существует более одного экземпляра. Функция перегруженная
#include <iostream> #include <math.h> #include <iomanip> using namespace std; int main(){ float s, p; int c, a; s=0; ...

Выясните, сохраняет ли булева функция 0, 1, является ли функция линейной, монотонной, само двойственной?
Помогите пожалуйста!!! Булева функция задана вектором значений F(x)=(1001) Выясните, сохраняет ли эта функция 0, 1, является ли эта...

Какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get()?
какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get()

Функция - Pos(s,s1). Назначение - поиск первого вхождения подстроки s1 в строку s (аналогичная функция C - strstr)
Функция - Pos(s,s1). Назначение - поиск первого вхождения подстроки s1 в строку s (аналогичная функция C - strstr).Помогите плииз


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru