OemTOChar

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
prikolist
Сообщения: 38
Зарегистрирован: 19 ноя 2008, 13:09

Подскажите,если не трудно, функция OemTоChar с какой кодировки переводит в какую. Знаю что ChatTоOem переводит с символьного в кодировку в русскую 1251, а OemTоChar. Зараннее благодарю.
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Функции OemTоChar и ChatTоOem работают с кодировкой, установленной на машине и переводят только в установленную кодировку.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
prikolist
Сообщения: 38
Зарегистрирован: 19 ноя 2008, 13:09

Вы можете написать, отдельно что делает OemTоChar и CharToOem, а не вообщем,что делают эти 2 функции?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

Функция OeмToChar конвертирует строку из старой ДОСовской кодировки (OEM DOS character set) в Windows кодировку (Windows ANSI character set). Соответственно вторая функция совершает обратное действие.

Для того, чтобы лучше понять что такое OEM кодировка достаточно просто открыть любой текстовый файлик с русскими буквами, созданный в ДОС или в любом ДОСовском приложении (например в BC 3.1, с которого мы все начинали)... открыть и увидеть, что в Windows он отображается в виде кракозябр. Однако это касается только русских символов - над латинскими символами кракозябры не властны :)

Думаю, все мы неоднократно сталкивались с такой проблемой. Особенно часто мы с ней сталкивались раньше, в Windows 98, так как он перед своим запуском загружал полноценный ДОС, в котором можно было работать, если разместить в autoexec.bat запуск ДОС навигатора или настроить его запуск через менюшку, подправив config.sys... эх были же времена :)

Но и сейчас с этой проблемой столкнуться не так сложно. К примеру Far Manager ниже версии 2 по умолчанию создаёт все текстовые файлы в OEM кодировке. Так что при открытии такого файла в notepad мы увидим родные кракозябры вместо русских символов :)

Попрошу не путать понятие кодировки с понятием кодовой страницы. DOS и Win кодировки отличаются положением символов в таблице, то есть одни и те же НЕ латинские символы имеют разные коды. При смене же кодовой страницы коды символов в самой строке не меняются. Кодовые страницы используются для иного отображения символов с тем же кодом.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
_SG
Сообщения: 53
Зарегистрирован: 28 фев 2009, 10:43
Откуда: Севастополь

по "опыту" маленькому)) OeмToChar ковертирует в двубайтовую строку, так что осторожнее... Это если я только не тупил когда мучал эту функцию.
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Romeo писал(а):Я не совсем понял, что хотел сказать Airhand. Вижу, что он не верно или не достаточно верно трактует работу этих функций, но написанного им не хватает для того, чтобы понять в чём его недопонимание и исправить.
Это у тебя - недопонимание. Если на компе будет установлен ( по-умолчанию) китайский язык, то функция OemToChar сконвертирует из китайской кодировки оем в char, а не из русской, как ожидалось. Надо ещё установить текущее местоположение. Всё это сложно и описано в МСДН.
по "опыту" маленькому)) OeмToChar ковертирует в двубайтовую строку, так что осторожнее... Это если я только не тупил когда мучал эту функцию.
std::wstring и есть двухбайтная. На то она и "широкая" строка.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

&quot писал(а):( по-умолчанию)
По умолчанию - это как? На правильный выбор translation table влияет опция Control Panel/Regional and Language Options/Advanced/Language for non-Unicode Programs. Слова "по-умолчанию" (по английски default), я здесь нигде не нашёл, но предположим, что именно эту опцию ты и имел ввиду. Кстати, вполне возможно, что в русской Windows для этой опции действительно используются слова "по-умолчанию", просто я за русской Windows уже не сидел лет 10, сорри если что.
&quot писал(а):а не из русской, как ожидалось
Кем ожидалось? Я такого не ожидал. В моём примере русские буквы были взяты только потому, что они располагаются в плавающей части OEM character set. Для каждого языка действительно существует своя translation table.
&quot писал(а):Надо ещё установить текущее местоположение
Месторасположение (опция Control Panel/Regional and Language Options/Regional Options/Location) НЕ влияет на работу этих двух функций.
&quot писал(а):Всё это сложно и описано в МСДН.
Ничего там сложного нет. Могу описать всё в деталях, если интересно.
&quot писал(а):по "опыту" маленькому)) OeмToChar ковертирует в двубайтовую строку, так что осторожнее...
Функция имеет следующий прототип:

Код: Выделить всё

BOOL OemToChar(      
    LPCSTR lpszSrc,
    LPTSTR lpszDst
);
То есть она преобразует из узкой строки в OEM формате в так называемую T-строку. Таким образом, если у тебя был определён макросимвол _UNICODE, то T строка действительно являлась широкой строкой. Если бы ты убрал определение этого символа, то получил был на выходе тоже узкую строку.
&quot писал(а):std::wstring и есть двухбайтная. На то она и "широкая" строка.
А это как сюда относится? Указанные функции не работают с STL типами данных.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
_SG
Сообщения: 53
Зарегистрирован: 28 фев 2009, 10:43
Откуда: Севастополь

Гм... у мну в VS2008 требовало WSTR, не TSTR. И в MSDN тоже прописана была вроде широкая строка. Мелькала мысль убрать из stdafx.h #define _UNICODE но как-то быстро исчезла... я просто сам всё ручками сделал)
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Сказано же
String that contains characters from the OEM DOS character set.
Если текущая страница на компе - не русская, то и результат будет не русский. Т.е. результат зависит от установки Regional and Language options на компе.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Ответить