Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Деструктор и наследование написал класс и наследник, при закомментированных деструкторах все работает, с ними результат выводится, но программа вылетает #include <iostream> class StrL { public: explicit StrL ();... https://www.cyberforum.ru/ cpp-beginners/ thread800576.html Поменять первый элемент со вторым,третий с четвертым и т.д C++
Дан массив из четного числа элементов.Поменять первый элемент со вторым,третий с четвертым и т.д. В чём ошибка? #include<stdio.h> #define n 6 int main() { int a; int i,temp; ...
C++ Получить 10 наиболее часто встречающихся слов из файла https://www.cyberforum.ru/ cpp-beginners/ thread800551.html
Дан символьный файл f, содержащий произвольный текст длиной более 50 слов. Слова в тексте разделены пробелами и знаками препинания. Получить 10 наиболее часто встречающихся слов.
C++ Подпрограмма (функция) https://www.cyberforum.ru/ cpp-beginners/ thread800545.html
Здравствуйте,подскажите в чем проблема понять не могу,прога с виду примитивная и простая ,но значения не верные выдает. Задание звучит так: Даны по 3 стороны для трех треугольников. Найти медианы...
C++ Деление на натуральное число
Доброго времени суток! У меня, наверное, глупая проблема, но все таки хочется разобраться. Вот программа, где мне нужно найти число, взаимно обратное N. Но после компиляции С всегда равно 0, кроме...
C++ Вычисление одного из углов треугольника, когда заданы значения двух других углов Написать программу вычисления одного из углов треугольника, когда заданы значения двух других углов. Рекомендуемый вид экрана во время ра-боты. >Введите исходные данные: >Угол А (град) > ... https://www.cyberforum.ru/ cpp-beginners/ thread800534.html
C++ Файлы. Получить названия, состоящие из двойных слов https://www.cyberforum.ru/ cpp-beginners/ thread800499.html
В текстовом файле хранятся названия городов через запятую. Получить названия, состоящие из двойных слов, например, Нью-Йорк, Новый Орлеан, результат отсортировать в алфавитном порядке. Прошу помочь...
После каждого вхождения символа С в строку S вставить строку S0 C++
1)Простые действия со строками. Дан символ С и строки S, S0. После каждого вхождения символа С в строку S вставить строку S0. Помогите пожалуйста.
C++ Ассемблерная вставка в с++ https://www.cyberforum.ru/ cpp-beginners/ thread800495.html
С помощью логических операций реализуйте запись битов в данной ячейки памяти, размером в 2 байта, в обратном порядке. Вот моя, отдаленная, ни на что похожая попытка((( #include "stdafx.h" ...
C++ Ввод в двумерный массив из консоли https://www.cyberforum.ru/ cpp-beginners/ thread800493.html
Всем привет! Надо было реализовать ввод из консоли в массив целых чисел. #include <clocale> #include <stdio.h> #include <iostream> #include <conio.h> using namespace std; void main(void){...
C++ Как ввести данные из файла в массив?
Доброго времени суток. Как ввести из файла данные в массив? Сейчас они уже прописаны. Можно это сделать двумя циклами, только не могу сообразить как? #include <conio> #include <stdio> #include...
C++ Вычислить количество элементов массива, не больших -5 https://www.cyberforum.ru/ cpp-beginners/ thread800463.html
вычислить количество элементов не больших -5 в одномерном массиве А. Задание дано на работу с файлами. Результат нужно записать в тот же ф-л, из которого и брались числа(дописать в конец). Если...
Jesus loves me
Эксперт С++
5173 / 3146 / 354
Регистрация: 12.12.2009
Сообщений: 7,947
Записей в блоге: 2
04.03.2013, 21:02 0

из UTF-8 в Windows-1251 - C++ - Ответ 4211234

04.03.2013, 21:02. Показов 41642. Ответов 7
Метки (Все метки)

Ответ

вторая ссылка в гугле по запросу "convert utf8 to windows 1251 c++"
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
 
#define LINE_MAX 1024
 
 
int convert_utf8_to_windows1251(const char* utf8, char* windows1251, size_t n);
 
 
int main(int argc, char ** argv)
{
        //printf("start %s\n", argv[0]);
 
 
        if (argc <= 1) {
                printf("forgot file name for conversion");
                exit(EXIT_FAILURE);
        }
 
 
        FILE* file = fopen(argv[1], "r");
        if (!file) {
                perror("can't open file");
                exit(EXIT_FAILURE);
        }
 
 
        while(!feof(file)) {
                char buff[LINE_MAX] = {0};
                if (!fgets(buff, LINE_MAX, file)) {
                        perror("can't read line from file");
                        exit(EXIT_FAILURE);
                }
 
 
                char output[LINE_MAX] = {0};
                if (!convert_utf8_to_windows1251(buff, output, LINE_MAX)) {
                        printf("can't convert line: %s\n", buff);
                        exit(EXIT_FAILURE);
                }
                printf("%s", output);
        };
 
 
        return EXIT_SUCCESS;
}
 
 
typedef struct ConvLetter {
        char    win1251;
        int             unicode;
} Letter;
 
 
static Letter g_letters[] = {
        {0x82, 0x201A}, // SINGLE LOW-9 QUOTATION MARK
        {0x83, 0x0453}, // CYRILLIC SMALL LETTER GJE
        {0x84, 0x201E}, // DOUBLE LOW-9 QUOTATION MARK
        {0x85, 0x2026}, // HORIZONTAL ELLIPSIS
        {0x86, 0x2020}, // DAGGER
        {0x87, 0x2021}, // DOUBLE DAGGER
        {0x88, 0x20AC}, // EURO SIGN
        {0x89, 0x2030}, // PER MILLE SIGN
        {0x8A, 0x0409}, // CYRILLIC CAPITAL LETTER LJE
        {0x8B, 0x2039}, // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
        {0x8C, 0x040A}, // CYRILLIC CAPITAL LETTER NJE
        {0x8D, 0x040C}, // CYRILLIC CAPITAL LETTER KJE
        {0x8E, 0x040B}, // CYRILLIC CAPITAL LETTER TSHE
        {0x8F, 0x040F}, // CYRILLIC CAPITAL LETTER DZHE
        {0x90, 0x0452}, // CYRILLIC SMALL LETTER DJE
        {0x91, 0x2018}, // LEFT SINGLE QUOTATION MARK
        {0x92, 0x2019}, // RIGHT SINGLE QUOTATION MARK
        {0x93, 0x201C}, // LEFT DOUBLE QUOTATION MARK
        {0x94, 0x201D}, // RIGHT DOUBLE QUOTATION MARK
        {0x95, 0x2022}, // BULLET
        {0x96, 0x2013}, // EN DASH
        {0x97, 0x2014}, // EM DASH
        {0x99, 0x2122}, // TRADE MARK SIGN
        {0x9A, 0x0459}, // CYRILLIC SMALL LETTER LJE
        {0x9B, 0x203A}, // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
        {0x9C, 0x045A}, // CYRILLIC SMALL LETTER NJE
        {0x9D, 0x045C}, // CYRILLIC SMALL LETTER KJE
        {0x9E, 0x045B}, // CYRILLIC SMALL LETTER TSHE
        {0x9F, 0x045F}, // CYRILLIC SMALL LETTER DZHE
        {0xA0, 0x00A0}, // NO-BREAK SPACE
        {0xA1, 0x040E}, // CYRILLIC CAPITAL LETTER SHORT U
        {0xA2, 0x045E}, // CYRILLIC SMALL LETTER SHORT U
        {0xA3, 0x0408}, // CYRILLIC CAPITAL LETTER JE
        {0xA4, 0x00A4}, // CURRENCY SIGN
        {0xA5, 0x0490}, // CYRILLIC CAPITAL LETTER GHE WITH UPTURN
        {0xA6, 0x00A6}, // BROKEN BAR
        {0xA7, 0x00A7}, // SECTION SIGN
        {0xA8, 0x0401}, // CYRILLIC CAPITAL LETTER IO
        {0xA9, 0x00A9}, // COPYRIGHT SIGN
        {0xAA, 0x0404}, // CYRILLIC CAPITAL LETTER UKRAINIAN IE
        {0xAB, 0x00AB}, // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
        {0xAC, 0x00AC}, // NOT SIGN
        {0xAD, 0x00AD}, // SOFT HYPHEN
        {0xAE, 0x00AE}, // REGISTERED SIGN
        {0xAF, 0x0407}, // CYRILLIC CAPITAL LETTER YI
        {0xB0, 0x00B0}, // DEGREE SIGN
        {0xB1, 0x00B1}, // PLUS-MINUS SIGN
        {0xB2, 0x0406}, // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
        {0xB3, 0x0456}, // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
        {0xB4, 0x0491}, // CYRILLIC SMALL LETTER GHE WITH UPTURN
        {0xB5, 0x00B5}, // MICRO SIGN
        {0xB6, 0x00B6}, // PILCROW SIGN
        {0xB7, 0x00B7}, // MIDDLE DOT
        {0xB8, 0x0451}, // CYRILLIC SMALL LETTER IO
        {0xB9, 0x2116}, // NUMERO SIGN
        {0xBA, 0x0454}, // CYRILLIC SMALL LETTER UKRAINIAN IE
        {0xBB, 0x00BB}, // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
        {0xBC, 0x0458}, // CYRILLIC SMALL LETTER JE
        {0xBD, 0x0405}, // CYRILLIC CAPITAL LETTER DZE
        {0xBE, 0x0455}, // CYRILLIC SMALL LETTER DZE
        {0xBF, 0x0457} // CYRILLIC SMALL LETTER YI
};
 
 
 
 
 
 
int convert_utf8_to_windows1251(const char* utf8, char* windows1251, size_t n)
{
        int i = 0;
        int j = 0;
        for(; i < (int)n && utf8[i] != 0; ++i) {
                char prefix = utf8[i];
                char suffix = utf8[i+1];
                if ((prefix & 0x80) == 0) {
                        windows1251[j] = (char)prefix;
                        ++j;
                } else if ((~prefix) & 0x20) {
                        int first5bit = prefix & 0x1F;
                        first5bit <<= 6;
                        int sec6bit = suffix & 0x3F;
                        int unicode_char = first5bit + sec6bit;
 
 
                        if ( unicode_char >= 0x410 && unicode_char <= 0x44F ) {
                                windows1251[j] = (char)(unicode_char - 0x350);
                        } else if (unicode_char >= 0x80 && unicode_char <= 0xFF) {
                                windows1251[j] = (char)(unicode_char);
                        } else if (unicode_char >= 0x402 && unicode_char <= 0x403) {
                                windows1251[j] = (char)(unicode_char - 0x382);
                        } else {
                                int count = sizeof(g_letters) / sizeof(Letter);
                                for (int k = 0; k < count; ++k) {
                                        if (unicode_char == g_letters[k].unicode) {
                                                windows1251[j] = g_letters[k].win1251;
                                                goto NEXT_LETTER;
                                        }
                                }
                                // can't convert this char
                                return 0;
                        }
NEXT_LETTER:
                        ++i;
                        ++j;
                } else {
                        // can't convert this chars
                        return 0;
                }
        }
        windows1251[j] = 0;
        return 1;
}
Добавлено через 2 минуты
да кстати код под лицензией New BSD License, советую ознакомиться.

Добавлено через 57 секунд
ссылка на проект http://code.google.com/p/convert-utf8-to-cp1251/, все таки нужно упомянуть автора.

Вернуться к обсуждению:
из UTF-8 в Windows-1251 C++
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.03.2013, 21:02
Готовые ответы и решения:

масив Char (Windows-1251, ASCII, UTF-8)
Перехожу с мелкомяхких на linux (с Delphi на С++), так как все мои программы занимаются обработкой...

Setconsolecp 1251, setconsoleoutputcp 1251 (Windows.h), сбиваются шрифты на других ПК
Пишу консольную прогу с помощью vs 2017 (v141), на windows 10, с версией sdk 10.0.17134.0, MFC - в...

UTF-16 -> cp-1251(windows-1251)
У меня есть кириллическая строка UTF-16, которая выглядит как Хотелось бы конвертнуть её в...

{SetConsoleCP(1251); SetConsoleOutputCP(1251); сломал русс шрифт
получилось так что скомпилил и запустил программу со строкой {SetConsoleCP(1251);...

7
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2013, 21:02

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Конвертация из ASCII в UTF-32 или UTF-8 в UTF-32
Собсно сабж.

Кодировки кириллицы: CP866, Windows-1251, ввод/вывод
Доброго времени суток! Помогите, пожалуйста, разобраться с кодировками. Каким образом в одном...

Перекодировать строку из кодировки KOI в кодировку Windows-1251 и обратно
Кодировщик. Написать программу, перекодирующую строку в кодировке KOI в строку в кодировке...

Даны три файла в 3х разных кодировках, перевести текст в Windows-1251 и записать в один файл
Даны три файла в 3х разных кодировках, перевести текст в Windows-1251 и записать в один файл. В...

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