Страница 1 из 1

OemTOChar

Добавлено: 11 сен 2009, 12:51
prikolist
Подскажите,если не трудно, функция OemTоChar с какой кодировки переводит в какую. Знаю что ChatTоOem переводит с символьного в кодировку в русскую 1251, а OemTоChar. Зараннее благодарю.

Re: OemTOChar

Добавлено: 12 сен 2009, 12:22
Airhand
Функции OemTоChar и ChatTоOem работают с кодировкой, установленной на машине и переводят только в установленную кодировку.

Re: OemTOChar

Добавлено: 12 сен 2009, 12:54
prikolist
Вы можете написать, отдельно что делает OemTоChar и CharToOem, а не вообщем,что делают эти 2 функции?

Re: OemTOChar

Добавлено: 13 сен 2009, 11:45
Romeo
Я не совсем понял, что хотел сказать 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 кодировки отличаются положением символов в таблице, то есть одни и те же НЕ латинские символы имеют разные коды. При смене же кодовой страницы коды символов в самой строке не меняются. Кодовые страницы используются для иного отображения символов с тем же кодом.

Re: OemTOChar

Добавлено: 13 сен 2009, 13:56
_SG
по "опыту" маленькому)) OeмToChar ковертирует в двубайтовую строку, так что осторожнее... Это если я только не тупил когда мучал эту функцию.

Re: OemTOChar

Добавлено: 13 сен 2009, 18:25
Airhand
Romeo писал(а):Я не совсем понял, что хотел сказать Airhand. Вижу, что он не верно или не достаточно верно трактует работу этих функций, но написанного им не хватает для того, чтобы понять в чём его недопонимание и исправить.
Это у тебя - недопонимание. Если на компе будет установлен ( по-умолчанию) китайский язык, то функция OemToChar сконвертирует из китайской кодировки оем в char, а не из русской, как ожидалось. Надо ещё установить текущее местоположение. Всё это сложно и описано в МСДН.
по "опыту" маленькому)) OeмToChar ковертирует в двубайтовую строку, так что осторожнее... Это если я только не тупил когда мучал эту функцию.
std::wstring и есть двухбайтная. На то она и "широкая" строка.

Re: OemTOChar

Добавлено: 13 сен 2009, 21:50
Romeo
&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 типами данных.

Re: OemTOChar

Добавлено: 13 сен 2009, 22:36
_SG
Гм... у мну в VS2008 требовало WSTR, не TSTR. И в MSDN тоже прописана была вроде широкая строка. Мелькала мысль убрать из stdafx.h #define _UNICODE но как-то быстро исчезла... я просто сам всё ручками сделал)

Re: OemTOChar

Добавлено: 14 сен 2009, 16:23
Airhand
Сказано же
String that contains characters from the OEM DOS character set.
Если текущая страница на компе - не русская, то и результат будет не русский. Т.е. результат зависит от установки Regional and Language options на компе.