Есть несколько функций, которые конвертируют ANSI в Unicode и наоборот. Вот эти функции WideCharToMultiByte
, MultiByteToWideChar
, A2W
, W2A
,
Теперь я не понимаю, как A2W
а также W2A
Работа. Дело в том, что когда вы конвертируете что-то в нечто другое, вам нужно установить два набора A
и установить B
так что каждый элемент в наборе A
отображается на один и только один элемент в наборе B
однозначно. В связи с этим есть несколько проблем:
ANSI — это один байт, а UNICODE — как минимум 2 байта, что означает, что не все элементы в наборе UNICODE могут быть однозначно сопоставлены с ANSI.
Задавать ANSI
и установить Unicode
не строго определены. Я имею в виду разные кодировки для обоих.
Таким образом, мой вопрос: как мы можем конвертировать их и быть уверенными, что мы не испортили данные?
Как уже упоминалось, нет такого набора символов, как «ANSI». К сожалению, Windows API относится к CP_ACP
‘кодовая страница ANSI’, которая относится к одному из нескольких наборов символов в зависимости от того, какой язык не-Unicode выбран на вашем компьютере.
Тем не менее, что касается вашего первоначального вопроса, нет, вы не можете всегда между CP_ACP
и кодировка Unicode. Там нет эквивалента для あ в CP_ACP
в англоязычной системе Windows, например.
Когда это произойдет, WideCharToMultiByte
заменит символ, который не имеет эквивалента lpDefaultChar
, если установлено, и установлено *lpUsedDefaultChar
к истине. Вы можете передать указатель на логическую переменную в lpUsedDefaultChar
и проверьте его после вызова, чтобы увидеть, содержит ли ваша строка непереводимые символы. Другое направление, MultiByteToWideChar
однако, никогда не происходит сбои, пока ввод действителен в вашей локальной кодовой странице. Чтобы попытаться обнаружить недопустимый текст, введите MB_ERR_INVALID_CHARS
пометьте и проверьте на наличие ошибки — это говорит о том, что текст находится на какой-то другой кодовой странице, но это не значит, что вы получите сообщение об ошибке (трудно сказать, является ли текст на самом деле недействительным или это просто бред) ,
Сделайте конвертацию в оба конца, затем сравните результат с оригиналом.
Вы можете, вероятно, вызвать функции преобразования, чтобы они выдавали ошибку для неопределенного результата, если хотите.