Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 23.06.2012
Сообщений: 18
1

Русские символы из ASCII

18.07.2012, 09:08. Просмотров 3070. Ответов 16
Метки нет (Все метки)

Программа отправляет "POST" запрос в гугл Speech и сохраняет ответ. Но сохраняет в ASCII. Текстовый редактор читает это нормально, а вот уже из программы открыть этот файл и сохранить нужный текст без иероглифов нормально не могу. Если создать свой текстовый файл и заполнить его так-же самому, то все отлично работает.
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
#include <tchar.h>
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <Windows.h>
 
using namespace std;
 
std::ifstream input;
HGLOBAL hGlob;
char texty[700];
char ontexty[700];
size_t sizet = 0;
int main(int nNumberofArgs, char* pszArgs[])
{
    po[699] = 0;
    texty[699] = 0;
    ontexty[699] = 0;
    input.open("d:\\Programm\\upload.txt");
    input.getline(texty, 500);
    texty[699] = 0;
    for(int ryt = 83; texty[ryt] != ('"'); ryt++)
    {
        ontexty[sizet] = texty[ryt];
        sizet++;
    }
    ontexty[699] = 0;
    sizet++;
   OpenClipboard(NULL);
   // Remove the current Clipboard contents
  EmptyClipboard();
   // Get the currently selected data
   HGLOBAL hGlob = GlobalAlloc(GMEM_FIXED, sizet);
   memcpy(GlobalLock(hGlob), ontexty, sizet);
   // For the appropriate data formats...
   if ( ::SetClipboardData(CF_TEXT | CF_OEMTEXT, hGlob ) == NULL )
   {
      CloseClipboard();
      GlobalFree(hGlob);
   }
   CloseClipboard();
    
 
    system("PAUSE");
    return 0;
}
Заранее спасибо.

P.S. Единственное, что известно, так это на каждую русскую букву уходит по 1 лишнему байту, то есть буква занимает 2 байта. С Английским все норм.
0
Вложения
Тип файла: txt upload.txt (123 байт, 23 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2012, 09:08
Ответы с готовыми решениями:

Широкие символы wchar_t wstring не хотят принимать русские символы
Собственно вопрос в шапке, вот примеры: std::wstring str = L&quot;блин комом&quot;; и такое: wchar_t...

ASCII коды переводит на русские буквы
Пишут значит cout&lt;&lt;char(197); А мне буквы выводит а не символ,тот который надо.Что делать?

Перевести в ASCII код русские буквы
Ребят, возникла проблема перевод в ascii код русские буквы. В инетрнете нашел что надо использовать...

Вывести на консоль русские буквы, используя ASCII-коды
С англ и т.д. всё работает нормально, но как только пытаюсь вытащить код символа русской буквы, так...

16
1 / 1 / 0
Регистрация: 23.06.2012
Сообщений: 18
18.07.2012, 09:25  [ТС] 2
Скорее всего закодировано под KOI8-R, но как этим воспользоваться?
0
1 / 1 / 0
Регистрация: 23.06.2012
Сообщений: 18
19.07.2012, 21:40  [ТС] 3
Если никто не знает, тогда киньте пожалуйста эту тему в "для экспертов". А то у меня нет "прав".
0
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.07.2012, 21:58 4
Вот тут похожая тема. UTF-8 - русские символы в char посимвольно
1
1 / 1 / 0
Регистрация: 23.06.2012
Сообщений: 18
19.07.2012, 22:23  [ТС] 5
alsav22, спасибо. За пару секунд до вашего сообщения при помощи http://www.artlebedev.ru/tools/decoder/ понял, что это UTF-8. Спасибо.

Добавлено через 9 минут
Еще вопрос появился: А на что заменить input.getline(texty, 500), так как она не хочет работать с wchar_t
0
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.07.2012, 22:33 6
Цитата Сообщение от ipoder Посмотреть сообщение
А на что заменить input.getline(texty, 500), так как она не хочет работать с wchar_t
Вот так, вроде бы, соглашается:
C++
1
std::wifstream input;
1
1 / 1 / 0
Регистрация: 23.06.2012
Сообщений: 18
19.07.2012, 23:13  [ТС] 7
Все равно не распознает тест, то есть получаю чуть другие кракозябры.
0
591 / 529 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
20.07.2012, 02:15 8
банально локаль ставить не пробывали?
Русские шрифты в консоли

ПС: только дня 2 назад пытался скопировать в буфер обмена русский текст, в итоге часа мучений ничего не вышло*(
0
1 / 1 / 0
Регистрация: 23.06.2012
Сообщений: 18
20.07.2012, 10:59  [ТС] 9
OstapBender, конечно пробывал и не работает. Это мне просто мозг выносит(
0
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.07.2012, 20:22 10
Цитата Сообщение от ipoder Посмотреть сообщение
OstapBender, конечно пробывал и не работает. Это мне просто мозг выносит(
Странный файлик. У меня с ним тоже ничего не получилось. Может его в отдельную тему вынести, без кода? Мол, есть файл, как его корректно вывести на консоль.

Добавлено через 3 часа 39 минут
Если этот файл сохранить как ANSI, то потом он нормально выводится. Может кто знает, как в С++ через код это сделать?
0
Модератор
Эксперт по электронике
8231 / 6098 / 814
Регистрация: 14.02.2011
Сообщений: 21,179
20.07.2012, 20:52 11
Цитата Сообщение от ipoder Посмотреть сообщение
так это на каждую русскую букву уходит по 1 лишнему байту, то есть буква занимает 2 байта.
посмотри в бинарном формате если через байт есть число 0х04 это Юникоде
а если нет то какая то кодировка если два байта то это действительно KOI8 но в кириллице есть и KOI8-U и KOI8-R

Добавлено через 17 минут
скачал файлик запустил в блокноте
{"status":0,"id":"7efc88a99dcc05fca219c80755c4c9a8-1","hypotheses":[{"utterance":"быстро","confidence":0.42369488}]}
судя по всему обычная виндос кодировка
0
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.07.2012, 20:57 12
Цитата Сообщение от ValeryS Посмотреть сообщение
запустил в блокноте
Проблема в выводе на консоль. Вместо "быстро" иероглифы, и никак не получается исправить. Блокнот, при сохранении, показывет, что это UTF-8. Если сохранить как ANSI, то потом на консоль выводится без проблем. Как его в программе перекодировать?
0
Модератор
Эксперт по электронике
8231 / 6098 / 814
Регистрация: 14.02.2011
Сообщений: 21,179
20.07.2012, 21:01 13
оперой определил что это UTF-8
а это юникоде кастрированый

Добавлено через 2 минуты
покажи как выводишь и как конвертируешь?
не всю программу а строки кода

Добавлено через 53 секунды
консоль работает в досовской кодировке необходимо конвертировать
0
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.07.2012, 21:12 14
Цитата Сообщение от ValeryS Посмотреть сообщение
Добавлено через 2 минуты
покажи как выводишь и как конвертируешь?
не всю программу а строки кода
У тебя он нормально на консоль выводится? Как конвертировать я не знаю. Сохранил его в четырёх вариантах (какие блокнот позволяет) и вывожу через этот код:
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
#include <iostream>
#include <fstream>
#include <Windows.h>
using namespace std;
 
int main()
{
    //setlocale(0, "");
    SetConsoleCP (1251); 
    SetConsoleOutputCP (1251);
    
    char *s[4] = {"upload.txt", "uploadANSI.txt", "uploadUNICOD.txt", "uploadUNICOD BIg.txt"};
    wchar_t *sw[4] = {L"upload.txt", L"uploadANSI.txt", L"uploadUNICOD.txt", L"uploadUNICOD BIg.txt"};
    char buff[500];
    wchar_t wbuff[500];
 
//*.................................................    
    cout << "1" << endl << endl;
    for (int i = 0; i < 4; i++)
    {
        ifstream f(s[i]);
        if (!f.is_open()) cout << "Error!" << endl;
        f.getline(buff, 500);
        cout << s[i] << endl;
        cout << buff << endl;
        f.close();
    }
//......................................................*/
//*....................................................
    cout << "2" << endl << endl;
    for (int i = 0; i < 4; i++)
    {
        wifstream fw(sw[i]);
        if (!fw.is_open()) cout << "Error!" << endl;
        fw.getline(wbuff, 500);
        wcout << sw[i] << L'\n';
        wcout << wbuff << L'\n';
        fw.close();
    }
//.......................................................*/
 
    system("pause");
    return 0;
}
Только ANSI нормально выводится.
0
195 / 195 / 78
Регистрация: 10.07.2012
Сообщений: 405
20.07.2012, 21:28 15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <fstream>
#include <Windows.h>
using namespace std;
 
int main()
{
    char buf1[500] = {0};
    ifstream f("e:\\upload.txt");
    f.getline(buf1, 500);
 
    wchar_t buf2[500] = {0};
 
    MultiByteToWideChar(CP_UTF8, 0, buf1, 500, buf2, 500);
    wcout.imbue(locale("rus_rus.866"));
    wcout << buf2 << endl;
}
2
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.07.2012, 00:13 16
Благодарю! Работает. Как сделать, чтобы до этого нормально выводились русские буквы? После, я попробовал, можно сделать, например, setlocale(0, ""); и вывод русских будет нормальный. А, до, как сделать?
И ещё вопрос. Такой код только для Windows?

Добавлено через 2 часа 12 минут
Получается так. Сначала setlocale(0, ".1251"); После MultiByteToWideChar(CP_UTF8, 0, buff, 500, wbuff, 500);, перед wcout << wbuff << endl;, так:wcout.imbue(locale("rus_rus.866")); или так: setlocale(0, "rus_rus.866");. Потом снова setlocale(0, ".1251");
1
1 / 1 / 0
Регистрация: 23.06.2012
Сообщений: 18
21.07.2012, 16:55  [ТС] 17
Vort_, Спасибо огромное. А то я уже и не надеялся.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.07.2012, 16:55

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ascii символы
Добрый день, подскажите почему неправильно выводятся русские заглавные буквы? Английские выводятся....

символы ascii
system(&quot;color A&quot;); SetConsoleCP(1251); SetConsoleOutputCP(1251); srand(static_cast&lt;unsigned...

Конвертер в символы ASCII
Нужно написать програму которая из файла берет даные и конвертирует их в код ASCII и потом...

Русские символы
Написал программу. Компилю из под cygwin g++. Ругается: 4.cpp:27:18: предупреждение:...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.