ANSI в Unicode или обратное преобразование: как это можно сделать?

Есть несколько функций, которые конвертируют ANSI в Unicode и наоборот. Вот эти функции WideCharToMultiByte, MultiByteToWideChar, A2W, W2A,

Теперь я не понимаю, как A2W а также W2A Работа. Дело в том, что когда вы конвертируете что-то в нечто другое, вам нужно установить два набора A и установить B так что каждый элемент в наборе A отображается на один и только один элемент в наборе B однозначно. В связи с этим есть несколько проблем:

  1. ANSI — это один байт, а UNICODE — как минимум 2 байта, что означает, что не все элементы в наборе UNICODE могут быть однозначно сопоставлены с ANSI.

  2. Задавать ANSI и установить Unicode не строго определены. Я имею в виду разные кодировки для обоих.

Таким образом, мой вопрос: как мы можем конвертировать их и быть уверенными, что мы не испортили данные?

0

Решение

Как уже упоминалось, нет такого набора символов, как «ANSI». К сожалению, Windows API относится к CP_ACP‘кодовая страница ANSI’, которая относится к одному из нескольких наборов символов в зависимости от того, какой язык не-Unicode выбран на вашем компьютере.

Тем не менее, что касается вашего первоначального вопроса, нет, вы не можете всегда между CP_ACP и кодировка Unicode. Там нет эквивалента для あ в CP_ACP в англоязычной системе Windows, например.

Когда это произойдет, WideCharToMultiByte заменит символ, который не имеет эквивалента lpDefaultChar, если установлено, и установлено *lpUsedDefaultChar к истине. Вы можете передать указатель на логическую переменную в lpUsedDefaultChar и проверьте его после вызова, чтобы увидеть, содержит ли ваша строка непереводимые символы. Другое направление, MultiByteToWideChar однако, никогда не происходит сбои, пока ввод действителен в вашей локальной кодовой странице. Чтобы попытаться обнаружить недопустимый текст, введите MB_ERR_INVALID_CHARS пометьте и проверьте на наличие ошибки — это говорит о том, что текст находится на какой-то другой кодовой странице, но это не значит, что вы получите сообщение об ошибке (трудно сказать, является ли текст на самом деле недействительным или это просто бред) ,

4

Другие решения

Сделайте конвертацию в оба конца, затем сравните результат с оригиналом.

Вы можете, вероятно, вызвать функции преобразования, чтобы они выдавали ошибку для неопределенного результата, если хотите.

1