Форум программистов, компьютерный форум, киберфорум
Наши страницы

Unicode, UTF-8 и ANSI в одном консольном приложении. Можно ли "на лету" конвертировать массив строк? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Другой рандом http://www.cyberforum.ru/cpp-beginners/thread709528.html
Есть некоторое беззнаковое целое N, нужна рандомная последовательность не повторяющихся беззнаковых целых меньше N. Длина последовательности не превышает N, но может быть меньше N, функция должна...
C++ Написать функцию, находящую сумму цифр целого числа Написать функцию SumDigit(N), находящую сумму цифр целого числа N (N - входной параметр). При вводе N реализовать проверку на корректность исходных данных (N > 0). http://www.cyberforum.ru/cpp-beginners/thread709484.html
Оператор цикла. Вывести таблицу степеней двойки от нулевой до десятой C++
Задание выполните, используя все три оператора цикла (т.е. вывод результатов на экран у Вас будет осуществляться трижды с коментарием о названии оператора цикла). Написать программу, которая...
C++ Динамическое программирование. Определить оптимальную загрузку самолетов с грузоподъёмностью от G до 1,3G
Помогите решить задачу на динамич. программирование: Самолет имеет максимальную грузоподъемность G(m). Предметы, загружаемые в самолет, имеют различные веса и стоимости: wi(m), Сi (руб.)...
C++ Объединить массивы в один, включив второй между пятым и шестым элементами http://www.cyberforum.ru/cpp-beginners/thread709420.html
Ввести с клавиатуры два одномерных массива содержащих 10 и 5 элементов. Объединить их в один массив, включив второй между пятым и шестым элементами.На экран вывести исходные массивы сформированные в...
C++ Запрет ввода символов в консоли моя консольная программа имеет очень много вводов от пользователя, через контекстное меню (нажмите 1 для того, 2 для другого) чтоб не делать и не зацикливать каждый ввод в коде, возможно ли... подробнее

Показать сообщение отдельно
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
26.11.2012, 14:24
Вот преобразование utf-8 в utf-32:
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
    //  UTF-8 -> UTF-32
    utf32string utf8ToUtf32( const utf8string& input )
    {
        //  Current state - none or matching 2-3-4 byte sequence
        enum {
            None,
            Two,
            Three,
            Four
        };
 
        utf32string wide;
        //  Unicode standard version 5.2 recommends to replace each maximal ill-formed subsequence by
        //  a single U+FFFD
        int32_t error = 0xfffd;
 
        int state = None;
        int32_t n;
        
        std::size_t length = input.size();
        for ( int i = 0; i < length; ++i ) {
            char c = input[ i ];
 
            if ( state == None ) {
                //  0xxx xxxx
                if ( ( c & 0x80 ) == 0 ) {
                    wide += c;
                } else {
                    //  110y yyyy   10xx xxxxx
                    if ( ( c & 0x70 ) == 0xc0 ) {
                        n = c & 0x1f;
                        state = Two;
                    } else {
                        //  1110 zzzz   10yy yyyy   10xx xxxx
                        if ( ( c & 0xf0 ) == 0xe0) {
                            n = c & 0x0f;
                            state = Three;
                        } else {
                            //  1111 0uuu   10uu zzzz   10yy yyyy   10xx xxxx
                            if ( ( c & 0xf8 ) == 0xf0 ) {
                                n = c & 0x07;
                                state = Four;
                            } else {
                                wide += error;
                                state = None;
                            }
                        }
                    }
                }
            } else {
                if ( ( c & 0xc0 ) == 0x80 ) {
                    n = ( n << 6 ) | ( c & 0x3f );
                    if ( --state == 0 ) {
                        wide += n;
                    }
                } else {
                    wide += error;
                    state = None;
                    //  Start matching subsequences from current faulty symbol
                    i--;
                }
            }
        }
 
        return wide;
    }
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru