36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
1

Как пользоваться функциями OemToChar/CharToOem?

30.08.2011, 13:49. Показов 46806. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Подскажите пожалуйста, как пользоваться функцией OemToChar/CharToOem?

Добавлено через 1 минуту
Лучше с примером
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.08.2011, 13:49
Ответы с готовыми решениями:

Как пользоваться функциями библиотеки Shell32
Как подключить данную библиотеку?

Как пользоваться функциями самописной библиотеки
я создал библиотеку классов, но как вызвать и использовать не знаю, помогите

Как подключить OpenGL под C# и как потом пользоваться функциями OpenGL
Уже неодонкратно поднималась тема о том, как подключить OpenGL под C# и как потом пользоваться...

Что импортировать, чтобы пользоваться математическими функциями?
Установил Microsoft Visual Studio Community 2015. VB не не понимает математические функции. (Код...

16
Заблокирован
30.08.2011, 14:20 2
1. открываем гугл.
2. Забиваем: CharToOem() с++
3. Профит!
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
30.08.2011, 14:47 3
Цитата Сообщение от Bers Посмотреть сообщение
открываем гугл
А первоисточник чем не угодил?
CharToOem
OemToChar
Там и примеры есть, если поискать...
0
Заблокирован
30.08.2011, 15:55 4
Цитата Сообщение от easybudda Посмотреть сообщение
А первоисточник чем не угодил?
Тем, что первоисточник - на английском. А вот гугл может выдать по сути тоже самое, но ещё и на русском.

Это уже если осталось какое то недопонимание, после прочтение русскоязычного мануала, тогда только лезу в англо-язычные мануалы. Это здорово экономит время.
2
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
30.08.2011, 20:40  [ТС] 5
Всё дело в типах данных. В справке написано "BOOL WINAPI OemToChar(
__in LPCSTR lpszSrc,
__out LPTSTR lpszDst
);" А что за тип данных LPCSTR/LPTSTR и как с ним работать я не знал. Но нашёл вот что:
C++
1
typedef const char* LPCSTR;
, и вот
C++
1
2
3
4
5
#ifdef UNICODE
 typedef LPWSTR LPTSTR;
#else
 typedef LPSTR LPTSTR;
#endif
. LPWSTR в свою очередь определено так:
C++
1
typedef WCHAR *LPWSTR;
, а WCHAR как
C++
1
typedef wchar_t WCHAR;
. Тогда я написал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Test4.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <string>
#include <conio.h>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    char *a="Привет";
    wchar_t *b=new wchar_t[7];
    OemToChar(a,b); 
    _getch(); 
    return 0;
}
И всё вроде заработало, но когда я включил пошаговый режим, то увидел, что в переменной b после конвертации вместо букв краказябры. Это так и должно быть? И как перевести, чтобы вместо букв остались буквы?
0
Заблокирован
30.08.2011, 21:06 6
мой вам совет: не нужно юзать чарТоОем.
Не нужно вообще конвертировать данные
0
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
30.08.2011, 23:45 7
И всё вроде заработало, но когда я включил пошаговый режим, то увидел, что в переменной b после конвертации вместо букв краказябры. Это так и должно быть? И как перевести, чтобы вместо букв остались буквы?
Это совершенно естественно. В буфере у тебя кодировка ОЕМ, а транслятор-то думает, что это АНСИ.

Добавлено через 48 секунд
Цитата Сообщение от Bers Посмотреть сообщение
мой вам совет: не нужно юзать чарТоОем.
Не нужно вообще конвертировать данные
Совет более чем странный
2
Заблокирован
31.08.2011, 00:03 8
Цитата Сообщение от Day Посмотреть сообщение
Совет более чем странный
Смысл коверкать данные?

/зы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//tchar.h
 
/***
*tchar.h - definitions for generic international text functions
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       Definitions for generic international functions, mostly defines
*       which map string/formatted-io/ctype functions to char, wchar_t, or
*       MBCS versions.  To be used for compatibility between single-byte,
*       multi-byte and Unicode text models.
*
*       [Public]
*
****/
0
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
31.08.2011, 11:50 9
Цитата Сообщение от Bers Посмотреть сообщение
Смысл коверкать данные?
Сошлюсь на собственный опыт. С 1992 года разрабатываю систему, у которой сейчас больше 2000 пользователей. Сначала в ДОСе, естественно с кодировкой ОЕМ. Потом Виндоус (АНСИ). Теперь приходится работать с Линухом, там КОИ-8 + разные версии UNICODE.
Заставить всех пользователей перекодировать тексты и базы данных, сопровождающие программы, я не могу(совершенно разная квалификация у них). Сделать это за них - тоже, т.к. тексты (и базы, естественно) доступны им для редактирования. И никто не может запретить им пользоваться текстами и базами, сделанными еще в прошлом тысячелетии. Так что мне ничего не остается, как поддерживать все эти штуки в ОЕМ и постоянно юзать то CharToOem, то OemToChar да еще iconv впридачу

Добавлено через 7 минут
http://msdn.microsoft.com/ru-r... 6s321.aspx
Увы, в моем случае это совершенно не подходит!
2
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
31.08.2011, 15:50  [ТС] 10
Странно, вот в таком примере всё работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Test4.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <string>
#include <conio.h>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    wchar_t *a=new wchar_t[10];
    for (int i=0;i<9;i++)
    {
        a[i]=i+1040;
    }
    a[9]=0;
    char *b=new char[10];
    CharToOem(a,b);
    cout<<b;
    _getch(); 
    return 0;
}
. Но когда я перенёс использвание функции CharToOem на перекодировку имени файла от диалога открытия файла на форме:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#pragma once
 
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Windows.h>
 
namespace Tiles {
 
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    
    /// <summary>
    /// Summary for Form1
    ///
    /// WARNING: If you change the name of this class, you will need to change the
    ///          'Resource File Name' property for the managed resource compiler tool
    ///          associated with all .resx files this class depends on.  Otherwise,
    ///          the designers will not be able to interact properly with localized
    ///          resources associated with this form.
    /// </summary>
    public ref class MainForm : public System::Windows::Forms::Form
    {
    public:
        MainForm(void)
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
        }
 
    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~MainForm()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::PictureBox^  mainPictureBox;
    protected: 
    private: System::Windows::Forms::Button^  openButton;
    private: System::Windows::Forms::HScrollBar^  mainHScrollBar;
    private: System::Windows::Forms::VScrollBar^  mainVScrollBar;
    private: System::Windows::Forms::OpenFileDialog^  mainOpenFileDialog;
 
 
 
    private:
        /// <summary>
        /// Required designer variable.
        /// </summary>
        System::ComponentModel::Container ^components;
 
#pragma region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        void InitializeComponent(void)
        {
            this->mainPictureBox = (gcnew System::Windows::Forms::PictureBox());
            this->openButton = (gcnew System::Windows::Forms::Button());
            this->mainHScrollBar = (gcnew System::Windows::Forms::HScrollBar());
            this->mainVScrollBar = (gcnew System::Windows::Forms::VScrollBar());
            this->mainOpenFileDialog = (gcnew System::Windows::Forms::OpenFileDialog());
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->mainPictureBox))->BeginInit();
            this->SuspendLayout();
            // 
            // mainPictureBox
            // 
            this->mainPictureBox->Location = System::Drawing::Point(12, 12);
            this->mainPictureBox->Name = L"mainPictureBox";
            this->mainPictureBox->Size = System::Drawing::Size(547, 277);
            this->mainPictureBox->TabIndex = 0;
            this->mainPictureBox->TabStop = false;
            // 
            // openButton
            // 
            this->openButton->Location = System::Drawing::Point(12, 316);
            this->openButton->Name = L"openButton";
            this->openButton->Size = System::Drawing::Size(571, 23);
            this->openButton->TabIndex = 1;
            this->openButton->Text = L"Открыть файл списка изображений";
            this->openButton->UseVisualStyleBackColor = true;
            this->openButton->Click += gcnew System::EventHandler(this, &MainForm::openButton_Click);
            // 
            // mainHScrollBar
            // 
            this->mainHScrollBar->Enabled = false;
            this->mainHScrollBar->Location = System::Drawing::Point(12, 292);
            this->mainHScrollBar->Name = L"mainHScrollBar";
            this->mainHScrollBar->Size = System::Drawing::Size(550, 21);
            this->mainHScrollBar->TabIndex = 2;
            // 
            // mainVScrollBar
            // 
            this->mainVScrollBar->Enabled = false;
            this->mainVScrollBar->Location = System::Drawing::Point(562, 12);
            this->mainVScrollBar->Name = L"mainVScrollBar";
            this->mainVScrollBar->Size = System::Drawing::Size(21, 280);
            this->mainVScrollBar->TabIndex = 3;
            // 
            // mainOpenFileDialog
            // 
            this->mainOpenFileDialog->Title = L"Выберите текстовый файл";
            // 
            // MainForm
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(592, 347);
            this->Controls->Add(this->mainVScrollBar);
            this->Controls->Add(this->mainHScrollBar);
            this->Controls->Add(this->openButton);
            this->Controls->Add(this->mainPictureBox);
            this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedSingle;
            this->MaximizeBox = false;
            this->MinimizeBox = false;
            this->Name = L"MainForm";
            this->Text = L"Показ больших картинок";
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->mainPictureBox))->EndInit();
            this->ResumeLayout(false);
 
        }
#pragma endregion
    private: System::Void openButton_Click(System::Object^  sender, System::EventArgs^  e) {                    
                 //Запуск диалога
                 if (mainOpenFileDialog->ShowDialog()==System::Windows::Forms::DialogResult::OK)
                 {  
                     //Преобразование строки
                     wchar_t *fileName=new wchar_t[mainOpenFileDialog->FileName->Length+1];
                     for (int i=0;i<mainOpenFileDialog->FileName->Length;i++)
                     {
                         fileName[i]=mainOpenFileDialog->FileName[i];
                     }      
                     fileName[mainOpenFileDialog->FileName->Length]=0;
                     char *fName=new char[mainOpenFileDialog->FileName->Length+1];
                     CharToOem(fileName,fName);//Вот здесь ошибка
 
                     //Запись в файл
                     FILE *picFile;
                     picFile=fopen(fName,"w");
                     putc('a',picFile);
                     fclose(picFile);
                 }
             }
    };
}
, то получил странную ошибку, которую и прочитать-то невозможно: "Error 1 error LNK2028: unresolved token (0A000012) "extern "C" int __stdcall CharToOemW(wchar_t const *,char *)" (?CharToOemW@@$$J18YGHPB_WPAD@Z) referenced in function "private: void __clrcall Tiles::MainForm::openButton_Click(class System::Object ^,class System::EventArgs ^)" (?openButton_Click@MainForm@Tiles@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4 @@Z) Tiles.obj Tiles". Когда убираю CharToOem, то ошибки нет. Думал, что нехватает какого-то модуля, подключил все из первого примера, но ошибка всё равно .
0
12 / 14 / 2
Регистрация: 03.08.2011
Сообщений: 213
31.08.2011, 16:53 11
юзай setlocale( LC_ALL,"Russian" ); и не парься
0
fasked
31.08.2011, 17:57
  #12

Не по теме:

Use Linux, Luke! :D

5
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
31.08.2011, 22:03  [ТС] 13
Я работаю в Microsoft Visual Studio 2008, и вот что обнаружил: когда создаю проект "Visual C++/Win32/Win32 Console Application", то этот пример работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Test5.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    wchar_t *inStr=L"Привет";
    char *outStr=new char[7];
    CharToOem(inStr,outStr);
    cout<<outStr<<'\n';
    system("pause");
    return 0;
}
, а когда создаю "Visual C++/CLR/CLR Console Application" или "Visual C++/CLR/Windows Forms Application", то этот пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Test6.cpp : main project file.
 
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
 
using namespace System;
 
int main(array<System::String ^> ^args)
{
    wchar_t *inStr=L"Привет";
    char *outStr=new char[7];
    CharToOem(inStr,outStr);
    cout<<outStr<<'\n';
    system("pause");
    return 0;
}
выдаёт ошибку при компилировании: "error LNK2028: unresolved token (0A00029D) "extern "C" int __stdcall CharToOemW(wchar_t const *,char *)" (?CharToOemW@@$$J18YGHPB_WPAD@Z) referenced in function "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z) Test6.obj Test6" Что это, баг MVS?

Добавлено через 3 часа 7 минут
Всё, проблема решена. Нужно добавить #pragma comment(lib,"user32.lib") в проект
0
Заблокирован
30.03.2016, 14:18 14
В CLR свой С++ и применять в нем cout не совсем разумно.
там есть своя функция вывода. хотя и эта дрянь тоже фурычет
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
30.03.2016, 14:23 15
RAFA91, пять лет думали?
Но кроме очередной фигни так ничего и не придумали
0
Заблокирован
30.03.2016, 17:08 16
Цитата Сообщение от Croessmah Посмотреть сообщение
пять лет думали
???
0
0 / 0 / 0
Регистрация: 15.06.2020
Сообщений: 3
18.06.2020, 15:53 17
да но с этой командой нельзя принимать одэкватный текст из консоли от пользователя
0
18.06.2020, 15:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2020, 15:53
Помогаю со студенческими работами здесь

Пример использования OemToChar.
Создаю текстовый файл. В него все пишется в виндовой кодировке, а мне надо в DOS. Спасибо.

Трабла с CharToOem и OemToChar
Привет мне по заданию нужно в программе блокноте сделать изменение кодировки с помощью CharToOem и...

Как пользоваться функциями
Есть книга: Б.Керниган, Д. Ритчи &quot;Язык программирования С&quot; второе издание. Там следующее:...

Как пользоваться самописными функциями?
ребят покажи пример как пользоваться самописнаннами функциями пример желательно=)

как пользоваться WinAPI функциями в MFC?
привет всем! скажите пожалуйста как пользоваться WinAPI функциями в MFC? в частности FindWindow...

как правельно пользоваться матетатическими функциями
помогите решить уравнение z1=2sin^2(3PI-2x)cos^2(5PI+2X) z2=1/4-1/4sin(5/2PI-8x)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru