Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с кирилиццей в utf-8 
V
    Опции темы
Gryfin
Дата 27.11.2011, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.9.2011

Репутация: нет
Всего: нет



Добрый день! Столкнулся с проблемой кириллических символов в файле с кодировкой utf-8. Вот код который использую: 

Код

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <locale>
#include <fstream>

using namespace std;

int main()
{
            locale::global(std::locale("rus"));
            setlocale(LC_CTYPE, "UTF-8");

            char getedList[1000]={0};
            char stringForGet[100]={0};

            ifstream getListTosearch("D:\\file.txt");
            while (! getListTosearch.eof())
                {
                    getListTosearch.getline(stringForGet, sizeof(stringForGet));
                       strcat (getedList, stringForGet);
                       strcat (getedList, "\n");
                }
            getListTosearch.close();

            cout << getedList << endl;

    system("PAUSE");
    return 0;
}



В файле содержится фраза "Привет мир! Hello world!" Нормально отображается только "Hello world", кириллическая часть нет. Если файл не utf-8, а кодировки ANSI, русская часть отлично отображается. Подскажите пожалуйста, как можно добиться чтобы кириллические символы в utf-8, также работали. Ну или подскажите как можно изменить кодировку файла.

Это сообщение отредактировал(а) Gryfin - 27.11.2011, 13:21
PM MAIL   Вверх
kshyms
  Дата 27.11.2011, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 303
Регистрация: 30.8.2006
Где: Душанбе

Репутация: нет
Всего: 0



Gryfin,  у меня та же проблема.  Я так понял необходимо  организовать цикл и перекодировать каждую букву кириллицы Форматов "CP1251" или "UTF-8" в Unikode Например: "Привет" "%EF%F0%E8%E2%E5%F2" или наоборот Это как я понял можно сделать с помощью библиотеки iconv и convert

Это сообщение отредактировал(а) kshyms - 27.11.2011, 15:46
PM MAIL WWW Skype   Вверх
kshyms
Дата 27.11.2011, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 303
Регистрация: 30.8.2006
Где: Душанбе

Репутация: нет
Всего: 0



Код

//Программы перекодировки KOI в WIN 
#ifndef __CODEPAGE_H__
#define __CODEPAGE_H__

// Константы для кодовых страниц
#define CP_KOI8       20866
#define CP_KOI8R      20866
#define CP_KOI8U      21866
#define CP_ISO_8859_5 28595

// Исключительно для удобства
#define CP_1251       1251

// Прототип функции-обертки
BOOL ConvertCP(UINT uiIN, UINT uiOUT, LPSTR lpString);

// Инлайновые обертки для сокращения кода

// Самая нужная из них
inline BOOL ConvertCP(UINT uiIN, UINT uiOUT, CString& szString){
  BOOL bRet = ConvertCP(uiIN, uiOUT, szString.GetBuffer(szString.GetLength()+1));
  szString.ReleaseBuffer();
  return bRet;
}

// Аналогичные можно определить по вкусу, смотря какое
// преобразование используется чаще
inline BOOL ConvertToKOI8(UINT uiIN, LPSTR lpString){
  return(ConvertCP(uiIN, CP_KOI8R, lpString));
}

inline BOOL ConvertFromKOI8(UINT uiOUI, LPSTR lpString){
  return(ConvertCP(CP_KOI8R, uiOUI, lpString));
}


inline BOOL ConvertToKOI8(UINT uiIN, CString& szString){
  return(ConvertCP(uiIN, CP_KOI8R, szString));
}


inline BOOL ConvertFromKOI8(UINT uiOUI, CString& szString){
  return(ConvertCP(CP_KOI8R, uiOUI, szString));
}

может это поможет?

Это сообщение отредактировал(а) kshyms - 27.11.2011, 21:18
PM MAIL WWW Skype   Вверх
volatile
Дата 27.11.2011, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(kshyms @  27.11.2011,  21:17 Найти цитируемый пост)
//Программы перекодировки KOI в WIN 

а KOI здесь вообще причём?

PM MAIL   Вверх
Gryfin
Дата 29.11.2011, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.9.2011

Репутация: нет
Всего: нет



Цитата(kshyms @ 27.11.2011,  21:17)
Код

//Программы перекодировки KOI в WIN 
#ifndef __CODEPAGE_H__
#define __CODEPAGE_H__

// Константы для кодовых страниц
#define CP_KOI8       20866
#define CP_KOI8R      20866
#define CP_KOI8U      21866
#define CP_ISO_8859_5 28595

// Исключительно для удобства
#define CP_1251       1251

// Прототип функции-обертки
BOOL ConvertCP(UINT uiIN, UINT uiOUT, LPSTR lpString);

// Инлайновые обертки для сокращения кода

// Самая нужная из них
inline BOOL ConvertCP(UINT uiIN, UINT uiOUT, CString& szString){
  BOOL bRet = ConvertCP(uiIN, uiOUT, szString.GetBuffer(szString.GetLength()+1));
  szString.ReleaseBuffer();
  return bRet;
}

// Аналогичные можно определить по вкусу, смотря какое
// преобразование используется чаще
inline BOOL ConvertToKOI8(UINT uiIN, LPSTR lpString){
  return(ConvertCP(uiIN, CP_KOI8R, lpString));
}

inline BOOL ConvertFromKOI8(UINT uiOUI, LPSTR lpString){
  return(ConvertCP(CP_KOI8R, uiOUI, lpString));
}


inline BOOL ConvertToKOI8(UINT uiIN, CString& szString){
  return(ConvertCP(uiIN, CP_KOI8R, szString));
}


inline BOOL ConvertFromKOI8(UINT uiOUI, CString& szString){
  return(ConvertCP(CP_KOI8R, uiOUI, szString));
}

может это поможет?

Спасибо за пример, но к сожалению не пригодился, так как решил пойти другим путём. Вот код:

Код

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <locale>
#include <fstream>

using namespace std;

void checkFile (char* fileName)
{
    char str01[1000]={0}; // массив для хранения текущей строки из файла
    char str02[10000]={0}; // массив для хранения всего текста из файла
    string filetext; // строка для хранения всего текста из файла

    ifstream testListTosearch(fileName);
    while (! testListTosearch.eof())
        {
            testListTosearch.getline(str01, sizeof(str01));
            strcat (str02, str01);
            strcat (str02, "\n");
        }

    filetext=str02;
    testListTosearch.close();

    int begsymbpos = filetext.find("п»ї"); // позиция в которой находится специальный символ utf-8

    if (begsymbpos!=0) // если позиция не равна нулю, т.е. началу файла то...
    {
        filetext.insert(0, "п»ї"); // добавить этот символ
    }
        ofstream addS(fileName); 
        addS << filetext; // Запись текста в изначальный файл вместе со спец. символом
        addS.close();
}

string utfConvert (char* filename)
{
            char getedList[10000]={0};  // массив для хранения всего текста из файла
            char stringForGet[1000]={0}; // массив для хранения текущей строки из файла

            ifstream getListTosearch(filename);
            while (! getListTosearch.eof())
                {
                    getListTosearch.getline(stringForGet, sizeof(stringForGet));
                    strcat (getedList, stringForGet);
                    strcat (getedList, "\n");
                }
            getListTosearch.close();

            string str1=getedList; // строка для хранения всего текста из файла
            
            for (;;) // Цикл который отвечает за поиск utf-8 символов и их замену в тексте на кирилические символы
            {
                int symb1 = str1.find("Р°");
                int symb2 = str1.find("Р±");
                int symb3 = str1.find("РІ");
                int symb4 = str1.find("Рі");
                int symb5 = str1.find("Рґ");
                int symb6 = str1.find("Рµ");
                int symb7 = str1.find("С‘");
                int symb8 = str1.find("Р¶");
                int symb9 = str1.find("Р·");
                int symb10 = str1.find("Рё");
                int symb11 = str1.find("Р№");
                int symb12 = str1.find("Рє");
                int symb13 = str1.find("Р»");
                int symb14 = str1.find("Рј");
                int symb15 = str1.find("РЅ");
                int symb16 = str1.find("Рѕ");
                int symb17 = str1.find("Рї");
                int symb18 = str1.find("СЂ");
                int symb19 = str1.find("СЃ");
                int symb20 = str1.find("С‚");
                int symb21 = str1.find("Сѓ");
                int symb22 = str1.find("С„");
                int symb23 = str1.find("С…");
                int symb24 = str1.find("С†");
                int symb25 = str1.find("С‡");
                int symb26 = str1.find("С€");
                int symb27 = str1.find("С‰");
                int symb28 = str1.find("СЉ");
                int symb29 = str1.find("С‹");
                int symb30 = str1.find("СЊ");
                int symb31 = str1.find("СЌ");
                int symb32 = str1.find("СЋ");
                int symb33 = str1.find("СЏ");
                int symb34 = str1.find("Рђ");
                int symb35 = str1.find("Р‘");
                int symb36 = str1.find("Р’");
                int symb37 = str1.find("Р“");
                int symb38 = str1.find("Р”");
                int symb39 = str1.find("Р•");
                int symb40 = str1.find("РЃ");
                int symb41 = str1.find("Р–");
                int symb42 = str1.find("Р—");
                int symb43 = str1.find("И");
                int symb44 = str1.find("Р™");
                int symb45 = str1.find("Рљ");
                int symb46 = str1.find("Р›");
                int symb47 = str1.find("Рњ");
                int symb48 = str1.find("Рќ");
                int symb49 = str1.find("Рћ");
                int symb50 = str1.find("Рџ");
                int symb51 = str1.find("Р ");
                int symb52 = str1.find("РЎ");
                int symb53 = str1.find("Рў");
                int symb54 = str1.find("РЈ");
                int symb55 = str1.find("Р¤");
                int symb56 = str1.find("РҐ");
                int symb57 = str1.find("Р¦");
                int symb58 = str1.find("Р§");
                int symb59 = str1.find("РЁ");
                int symb60 = str1.find("Р©");
                int symb61 = str1.find("РЄ");
                int symb62 = str1.find("Р«");
                int symb63 = str1.find("Р¬");
                int symb64 = str1.find("Р­");
                int symb65 = str1.find("Р®");
                int symb66 = str1.find("РЇ");

                if (symb1>0)
                {
                    str1.replace(symb1, 2, "а");
                }
                else if (symb2>0)
                {
                    str1.replace(symb2, 2, "б");
                }
                else if (symb3>0)
                {
                    str1.replace(symb3, 2, "в");
                }
                else if (symb4>0)
                {
                    str1.replace(symb4, 2, "г");
                }
                else if (symb5>0)
                {
                    str1.replace(symb5, 2, "д");
                }
                else if (symb6>0)
                {
                    str1.replace(symb6, 2, "е");
                }
                else if (symb7>0)
                {
                    str1.replace(symb7, 2, "ё");
                }
                else if (symb8>0)
                {
                    str1.replace(symb8, 2, "ж");
                }
                else if (symb9>0)
                {
                    str1.replace(symb9, 2, "з");
                }
                else if (symb10>0)
                {
                    str1.replace(symb10, 2, "и");
                }
                else if (symb11>0)
                {
                    str1.replace(symb11, 2, "й");
                }
                else if (symb12>0)
                {
                    str1.replace(symb12, 2, "к");
                }
                else if (symb13>0)
                {
                    str1.replace(symb13, 2, "л");
                }
                else if (symb14>0)
                {
                    str1.replace(symb14, 2, "м");
                }
                else if (symb15>0)
                {
                    str1.replace(symb15, 2, "н");
                }
                else if (symb16>0)
                {
                    str1.replace(symb16, 2, "о");
                }
                else if (symb17>0)
                {
                    str1.replace(symb17, 2, "п");
                }
                else if (symb18>0)
                {
                    str1.replace(symb18, 2, "р");
                }
                else if (symb19>0)
                {
                    str1.replace(symb19, 2, "с");
                }
                else if (symb20>0)
                {
                    str1.replace(symb20, 2, "т");
                }
                else if (symb21>0)
                {
                    str1.replace(symb21, 2, "у");
                }
                else if (symb22>0)
                {
                    str1.replace(symb22, 2, "ф");
                }
                else if (symb23>0)
                {
                    str1.replace(symb23, 2, "х");
                }
                else if (symb24>0)
                {
                    str1.replace(symb24, 2, "ц");
                }
                else if (symb25>0)
                {
                    str1.replace(symb25, 2, "ч");
                }
                else if (symb26>0)
                {
                    str1.replace(symb26, 2, "ш");
                }
                else if (symb27>0)
                {
                    str1.replace(symb27, 2, "щ");
                }
                else if (symb28>0)
                {
                    str1.replace(symb28, 2, "ъ");
                }
                else if (symb29>0)
                {
                    str1.replace(symb29, 2, "ы");
                }
                else if (symb30>0)
                {
                    str1.replace(symb30, 2, "ь");
                }
                else if (symb31>0)
                {
                    str1.replace(symb31, 2, "э");
                }
                else if (symb32>0)
                {
                    str1.replace(symb32, 2, "ю");
                }
                else if (symb33>0)
                {
                    str1.replace(symb33, 2, "я");
                }
                else if (symb34>0)
                {
                    str1.replace(symb34, 2, "А");
                }
                else if (symb35>0)
                {
                    str1.replace(symb35, 2, "Б");
                }
                else if (symb36>0)
                {
                    str1.replace(symb36, 2, "В");
                }
                else if (symb37>0)
                {
                    str1.replace(symb37, 2, "Г");
                }
                else if (symb38>0)
                {
                    str1.replace(symb38, 2, "Д");
                }
                else if (symb39>0)
                {
                    str1.replace(symb39, 2, "Е");
                }
                else if (symb40>0)
                {
                    str1.replace(symb40, 2, "Ё");
                }
                else if (symb41>0)
                {
                    str1.replace(symb41, 2, "Ж");
                }
                else if (symb42>0)
                {
                    str1.replace(symb42, 2, "З");
                }
                else if (symb43>0)
                {
                    str1.replace(symb43, 2, "И");
                }
                else if (symb44>0)
                {
                    str1.replace(symb44, 2, "Й");
                }
                else if (symb45>0)
                {
                    str1.replace(symb45, 2, "К");
                }
                else if (symb46>0)
                {
                    str1.replace(symb46, 2, "Л");
                }
                else if (symb47>0)
                {
                    str1.replace(symb47, 2, "М");
                }
                else if (symb48>0)
                {
                    str1.replace(symb48, 2, "Н");
                }
                else if (symb49>0)
                {
                    str1.replace(symb49, 2, "О");
                }
                else if (symb50>0)
                {
                    str1.replace(symb50, 2, "П");
                }
                else if (symb51>0)
                {
                    str1.replace(symb51, 2, "Р");
                }
                else if (symb52>0)
                {
                    str1.replace(symb52, 2, "С");
                }
                else if (symb53>0)
                {
                    str1.replace(symb53, 2, "Т");
                }
                else if (symb54>0)
                {
                    str1.replace(symb54, 2, "У");
                }
                else if (symb55>0)
                {
                    str1.replace(symb55, 2, "Ф");
                }
                else if (symb56>0)
                {
                    str1.replace(symb56, 2, "Х");
                }
                else if (symb57>0)
                {
                    str1.replace(symb57, 2, "Ц");
                }
                else if (symb58>0)
                {
                    str1.replace(symb58, 2, "Ч");
                }
                else if (symb59>0)
                {
                    str1.replace(symb59, 2, "Ш");
                }
                else if (symb60>0)
                {
                    str1.replace(symb60, 2, "Щ");
                }
                else if (symb61>0)
                {
                    str1.replace(symb61, 2, "Ъ");
                }
                else if (symb62>0)
                {
                    str1.replace(symb62, 2, "Ы");
                }
                else if (symb63>0)
                {
                    str1.replace(symb63, 2, "Ь");
                }
                else if (symb64>0)
                {
                    str1.replace(symb64, 2, "Э");
                }
                else if (symb65>0)
                {
                    str1.replace(symb65, 2, "Ю");
                }
                else if (symb66>0)
                {
                    str1.replace(symb66, 2, "Я");
                }
                else
                {
                    break;
                }
            }
            str1.erase(0,3); // удаление спец. символа utf-8 из текста
            return str1;
}

int main()
{
        locale::global(std::locale("rus"));
        setlocale(LC_CTYPE, "UTF-8");

        checkFile ("D:\\file.txt");
        cout << utfConvert ("D:\\file.txt");

    system("PAUSE");
    return 0;
}



Возможно кому-то пригодится. Я тестировал, вроде всё отображается как надо. Не самое лучшее решение однако оно работает. Хотелось бы узнать что скажут опытные люди по поводу такого решения и есть ли более простой или эстетичный вариант?
PM MAIL   Вверх
bsa
Дата 29.11.2011, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Gryfin @  29.11.2011,  09:32 Найти цитируемый пост)
Спасибо за пример, но к сожалению не пригодился, так как решил пойти другим путём.
А зря. Это ужасный костыль, лучше пользоваться нормальными функциями перекодирования. Они и работать будут значительно быстрее.

Это сообщение отредактировал(а) bsa - 29.11.2011, 15:55
PM   Вверх
Gryfin
Дата 29.11.2011, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.9.2011

Репутация: нет
Всего: нет



Цитата(bsa @ 29.11.2011,  10:50)
Цитата(Gryfin @  29.11.2011,  09:32 Найти цитируемый пост)
Спасибо за пример, но к сожалению не пригодился, так как решил пойти другим путём.
А зря. Это ужасный костыль, лучше пользоваться нормальными функциями перекодирования. Они и работать будут значительно.

Погуглил термин "костыль" - узнал много нового smile Согласен что это костыль, но хотелось бы узнать куда копать дальше чтобы решить проблему с utf-8 правильно. Того что скинул kshyms достаточно чтобы найти решение? Или ещё можете дать рекомендацию ?
PM MAIL   Вверх
bsa
Дата 29.11.2011, 16:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Gryfin @  29.11.2011,  16:06 Найти цитируемый пост)
Того что скинул kshyms достаточно чтобы найти решение?

в принципе да.
Цитата(Gryfin @  29.11.2011,  16:06 Найти цитируемый пост)
Или ещё можете дать рекомендацию ?

Сначала используешь MultiByteToWideChar с параметром CodePage равным CP_UTF8. Затем WideCharToMultiByte с параметром CodePage CP_ACP. И получаешь то, что хотел. Более того, между этими вызовами текст будет представлен в виде массива wchar_t. И ты сможешь использовать все стандартные юникодовые функции для модификации текста.
PM   Вверх
Gryfin
Дата 29.11.2011, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.9.2011

Репутация: нет
Всего: нет



Ясно, спасибо.
PM MAIL   Вверх
kshyms
Дата 1.12.2011, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 303
Регистрация: 30.8.2006
Где: Душанбе

Репутация: нет
Всего: 0



bsa, Профи....   smile 

Это сообщение отредактировал(а) kshyms - 1.12.2011, 10:57
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0908 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.