Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2015, 11:21   #1
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию Как преобразовать CP_ACP в UFT32?

Есть указатель на char, хранящий адрес нуль-терминальной строки в CP_ACP. Требуется получить std::u32string в кодировке UTF32. Желательно без промежуточных нуль-терминальных строк в иных кодировках. Можно как то надёжно преобразовать отдельный символ, чтоб потом скормить его оператору плюс равно? Есть ли гарантия, что в CP_ACP каждый символ занимает ровно 1 байт? И есть ли гарантия, что он влезет в UTF16?

Последний раз редактировалось taras-proger; 02.12.2015 в 12:20.
taras-proger вне форума Ответить с цитированием
Старый 02.12.2015, 12:43   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Есть ли гарантия, что в CP_ACP каждый символ занимает ровно 1 байт?
CP_ACP это вообще не какая либо конкретная кодировка. а ваша текущая системная.
для ANSI-1251(русская по умолчанию) например это точно да.
но есть и иные.
Цитата:
И есть ли гарантия, что он влезет в UTF16?
так UTF32 или UTF16?
в UTF в любой влезает все. на то она многобайтовая.

не понимаю что вы вообще пытаетесь сделать? винда не работает с UTF32 в принципе. да и с UTF-16 работает лишь с частью(что занимает 2 байта)

а так пример же
http://en.cppreference.com/w/cpp/str...ibyte/mbrtoc32
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.12.2015, 12:50   #3
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
CP_ACP это вообще не какая либо конкретная кодировка. а ваша текущая системная.
И? По-Вашему кто то может на винде захотеть преобразовать командную строку и ей подобные входные данные из конкретной кодировки? Хорошего же Вы мнения о мелкомягких.
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
для ANSI-1251(русская по умолчанию) например это точно да.
А при чём здесь конкретно русская? А может у юзверя винда будет греческая или китайская?

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
так UTF32 или UTF16?
Целевая UTF32, промежуточные UTF16 и UTF8. Есть ли гарантия, что после преобразования из CP_ACP в UTF16 код любого символа влезет ровно в два байта?

Последний раз редактировалось Stilet; 02.12.2015 в 13:17.
taras-proger вне форума Ответить с цитированием
Старый 02.12.2015, 12:57   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Нет, такой гарантии нет.
waleri вне форума Ответить с цитированием
Старый 02.12.2015, 13:27   #5
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

То есть символ может быть и многобайтным? Может ли функция
Код:
MultiByteToWideChar
при преоборазовании единичного символа из CP_ACP записать результат в два слова?

Последний раз редактировалось taras-proger; 02.12.2015 в 13:33.
taras-proger вне форума Ответить с цитированием
Старый 02.12.2015, 13:40   #6
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от taras-proger Посмотреть сообщение
То есть символ может быть и многобайтным? Может ли функция MultiByteToWideChar при преоборазовании единичного символа из CP_ACP записать результат в два слова?
Есть адрес символа в CP_ACP. Как узнать правильное значение четвёртого параметра функции MultiByteToWideChar? То есть как узнать, сколько байт реально занимает символ CP_ACP? UTF-8 просто, там первый байт содержит префикс длины. А в CP_ACP как? Есть для этого какая нибудь системная функция?
taras-proger вне форума Ответить с цитированием
Старый 02.12.2015, 16:38   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
По-Вашему кто то может на винде захотеть преобразовать командную строку и ей подобные входные данные из конкретной кодировки? Хорошего же Вы мнения о мелкомягких.
А при чем тут мелкомягкие? И у них, и в стд либе есть куча функция с параметром в виде нужной локали.
И да, если пишите прогу не для внутреннего использования, то учитывать локаль надо и преобразовывать тоже, а то будет как у некоторых программ, которые не могу в профиль писать, если имя пользователя на русском или японском.

Цитата:
То есть символ может быть и многобайтным?
Ну вы же сами китайскую упомянули. Прочитайте про Shift JIS, например.

Цитата:
при преоборазовании единичного символа из CP_ACP записать результат в два слова?
Что вы под этим подразумеваете?

Цитата:
Как узнать правильное значение четвёртого параметра функции MultiByteToWideChar?
Это размер в байтах входной строки в буфере. Если строка нуль-терминальная ставьте -1.

Последний раз редактировалось p51x; 02.12.2015 в 16:40.
p51x вне форума Ответить с цитированием
Старый 02.12.2015, 16:46   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
то учитывать локаль надо и преобразовывать тоже, а то будет как у некоторых программ, которые не могу в профиль писать, если имя пользователя на русском или японском.
или работать сразу в UCS-2 среде.(не UTF-32/UCS-4)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.12.2015, 17:45   #9
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А при чем тут мелкомягкие?
При том, что систему делал не болэнд. Если бы они конкретно и при этом адекватно завелосипедили уникод и повесили именно такой велосипед на дефолт, тогда перевод из него в стандартный и наоборот хоть как то понятен. Но у них у самих полный разброд с шатаниями, странно ещё, что восемь коей с ансями не перемешаны.
taras-proger вне форума Ответить с цитированием
Старый 02.12.2015, 17:47   #10
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Что вы под этим подразумеваете?
Например, суррогатную пару UTF16.
taras-proger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как преобразовать строку в название константу или её индификатор androidz Общие вопросы Delphi 10 27.02.2014 21:33
Как сохранить область на странице вhtml или как картинку или в pdf ? xxxsas PHP 0 10.12.2011 12:02
Как сделать MD5 строки в utf8? Anfall Общие вопросы Delphi 4 04.08.2011 16:54
Http.Get, Парсинг UTF8, знак - отображается как ? Как декодировать? XerSon Работа с сетью в Delphi 6 10.02.2011 08:37
Как получить адрес String строки или преобразовать String madboy4ik Общие вопросы по Java, Java SE, Kotlin 6 15.01.2010 11:57