OemTOChar
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Подскажите,если не трудно, функция OemTоChar с какой кодировки переводит в какую. Знаю что ChatTоOem переводит с символьного в кодировку в русскую 1251, а OemTоChar. Зараннее благодарю.
Функции OemTоChar и ChatTоOem работают с кодировкой, установленной на машине и переводят только в установленную кодировку.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
#define while if
Оптимизация по размеру:
#define struct union
Вы можете написать, отдельно что делает 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 кодировки отличаются положением символов в таблице, то есть одни и те же НЕ латинские символы имеют разные коды. При смене же кодовой страницы коды символов в самой строке не меняются. Кодовые страницы используются для иного отображения символов с тем же кодом.
Функция 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
по "опыту" маленькому)) OeмToChar ковертирует в двубайтовую строку, так что осторожнее... Это если я только не тупил когда мучал эту функцию.
Это у тебя - недопонимание. Если на компе будет установлен ( по-умолчанию) китайский язык, то функция OemToChar сконвертирует из китайской кодировки оем в char, а не из русской, как ожидалось. Надо ещё установить текущее местоположение. Всё это сложно и описано в МСДН.Romeo писал(а):Я не совсем понял, что хотел сказать Airhand. Вижу, что он не верно или не достаточно верно трактует работу этих функций, но написанного им не хватает для того, чтобы понять в чём его недопонимание и исправить.
std::wstring и есть двухбайтная. На то она и "широкая" строка.по "опыту" маленькому)) OeмToChar ковертирует в двубайтовую строку, так что осторожнее... Это если я только не тупил когда мучал эту функцию.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
#define while if
Оптимизация по размеру:
#define struct union
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
По умолчанию - это как? На правильный выбор translation table влияет опция Control Panel/Regional and Language Options/Advanced/Language for non-Unicode Programs. Слова "по-умолчанию" (по английски default), я здесь нигде не нашёл, но предположим, что именно эту опцию ты и имел ввиду. Кстати, вполне возможно, что в русской Windows для этой опции действительно используются слова "по-умолчанию", просто я за русской Windows уже не сидел лет 10, сорри если что." писал(а):( по-умолчанию)
Кем ожидалось? Я такого не ожидал. В моём примере русские буквы были взяты только потому, что они располагаются в плавающей части OEM character set. Для каждого языка действительно существует своя translation table." писал(а):а не из русской, как ожидалось
Месторасположение (опция Control Panel/Regional and Language Options/Regional Options/Location) НЕ влияет на работу этих двух функций." писал(а):Надо ещё установить текущее местоположение
Ничего там сложного нет. Могу описать всё в деталях, если интересно." писал(а):Всё это сложно и описано в МСДН.
Функция имеет следующий прототип:" писал(а):по "опыту" маленькому)) OeмToChar ковертирует в двубайтовую строку, так что осторожнее...
Код: Выделить всё
BOOL OemToChar(
LPCSTR lpszSrc,
LPTSTR lpszDst
);
А это как сюда относится? Указанные функции не работают с STL типами данных." писал(а):std::wstring и есть двухбайтная. На то она и "широкая" строка.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Гм... у мну в VS2008 требовало WSTR, не TSTR. И в MSDN тоже прописана была вроде широкая строка. Мелькала мысль убрать из stdafx.h #define _UNICODE но как-то быстро исчезла... я просто сам всё ручками сделал)
Сказано же
Если текущая страница на компе - не русская, то и результат будет не русский. Т.е. результат зависит от установки Regional and Language options на компе.String that contains characters from the OEM DOS character set.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
#define while if
Оптимизация по размеру:
#define struct union