Форум программистов, компьютерный форум, киберфорум С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/41: Рейтинг темы: голосов - 41, средняя оценка - 4.63
2 / 2 / 0
Регистрация: 21.11.2009
Сообщений: 26
1

Преобразовние Utf-16 <=> Utf-8

26.08.2011, 13:33. Показов 7425. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вопрос казалось бы простой, но нормально ответа на него я пока не нашел. Нужно вывести строчку юникода(UTF-16) в файл с изменением кодировки. Знаю что можно при при wofstream::imbue задать вывод в win-1251 и cp-866. Но как сделть преобразование из utf-16 в utf-8 я найти не могу. Поэтому прошу вашей помощи. Желательно что нибудь кроссплатформенное, поэтому MultiByteToWideChar() не предлагать. Если можно то неотвечайте в стиле: "гугли .." и "смотри ..", а дайте конкретный пример.Благодарю за внимание.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.08.2011, 13:33
Ответы с готовыми решениями:

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

C и UTF-8
Как для приложения на C установить кодировку UTF-8? Чтобы символы на кирилице выводились и вводились нормально.

Кириллицу в UTF-8
К примеру, у нас есть строка &quot;тест&quot;, нужно из него получить строку D1%82%D0%B5%D1%81%D1%82 для запроса

2
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
26.08.2011, 13:39 2
Лучший ответ Сообщение было отмечено hard-t как решение

Решение

arabica
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
  struct Tab
  {
    unsigned char char_mask;
    unsigned char char_value;
    int shift;
    unsigned long wide_mask;
  };
 
  static const Tab tab[] =
  {
    { char(0x80),  char(0x00),   0*6,    0x7F,   },   // 1 byte sequence
    { char(0xE0),  char(0xC0),   1*6,    0x7FF,  },   // 2 byte sequence
    { char(0xF0),  char(0xE0),   2*6,    0xFFFF, },   // 3 byte sequence
    { 0,           0,            0,      0,      }    // end of table
  };
 
std::codecvt_base::result Arabica::convert::impl::utf8_2_ucs2(
                       const char* from, const char* from_end, const char*& from_next,
                       wchar_t* to, wchar_t* to_limit, wchar_t*& to_next)
{
  from_next = from;
  to_next = to;
 
    while((from_next < from_end) && (to_next < to_limit))
    {
    unsigned char start = static_cast<unsigned char>(*from_next);
 
    const Tab *t = tab;
    for(; t->char_mask; ++t)
    {
      if((start & t->char_mask) == t->char_value)
        break;
    }
 
    if((from_next + (t - tab)) >= from_end)
      break;
 
    unsigned long wide_mask = t->wide_mask;
 
    *to_next = start;
    for(; t != tab; --t)
    {
      from_next++;
      *to_next = (*to_next << 6) | ((*from_next ^ 0x80) & 0xff);
    }
    *to_next &= wide_mask;
 
    ++from_next;
    ++to_next;
  } // while
 
  return (from_next == from_end) ? std::codecvt_base::ok : std::codecvt_base::partial;
} // utf8_2_ucs2


Если подходит То тебе сюда.

Хотя я в свое время предпочел делать примерно так.
iconv

C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
    std::codecvt_base::result utf16_2_utf8(const char* from, const char* from_end, const char*& from_next,
            char* to, char* to_end, char*& to_next, bool utf16_be)
    {
        from_next = from;
        to_next = to;
        size_t from_size = (from_end - from);
        Impl::iconv_result state = convert(from_next, from_size, to_next, (to_end - to), 
                    (utf16_be ? "UTF-16BE" : "UTF-16LE"), "UTF-8");
        return state == Impl::iconv_ok ? std::codecvt_base::ok : 
          state == Impl::iconv_partial ? std::codecvt_base::partial : std::codecvt_base::error;
    }
или так если UCS2 в UTF8.

C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
template<class CharT>
std::codecvt_base::result ucs2_2_utf8(const CharT* from, const CharT* from_end, const CharT*& from_next,
                                      char* to, char* to_end, char*& to_next, bool ucs2_be)
{
    from_next = from;
    to_next = to;
    size_t from_size = (from_end - from) * sizeof(CharT);
    Impl::iconv_result state = Locale::Convert::convert(from_next, from_size, to_next, (to_end - to), 
            (ucs2_be ? "UCS-2BE" : "UCS-2LE"), "UTF-8");
    return state == Impl::iconv_ok ? std::codecvt_base::ok : 
      state == Impl::iconv_partial ? std::codecvt_base::partial : std::codecvt_base::error;
}
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
namespace Locale
{
namespace Convert
{
namespace Impl
{
    class IconvError:public std::logic_error
    {
    public:
        IconvError(const std::string& string):
            std::logic_error(string)
        {
        }
    };
    
    std::string errno_open();
    std::string errno_convert();
    
    //iconv representation of std::codecvt_base::result.
    enum iconv_result
    {
        iconv_error = std::codecvt_base::error,
        iconv_partial = std::codecvt_base::partial,
        iconv_ok = std::codecvt_base::ok
    };
}//namespace Impl
 
    /*
     * Convert from from_code encoding to to_code encoding using libiconv.
     *
     * @types@
     *    CharT - internal char representation
     *    ExternCharT - external char representation
     * @types@
     *
     * @params@
     *    in_pointer - reference to internal char pointer
     *    in_size - size of internal char buffer
     *    out_pointer - reference to external char pointer
     *    out_size - size of external char buffer
     *    from_code - title of the internal encoding
     *    to_code - title of the external encoding
     * @params@
     *
     * @return@
     *    return iconv_error if iconv can`t convert
     *    return iconv_partial if partial conversion was happened
     *    return iconv_ok if encoding is succesfull
     *    throw exception if iconv handler can`t be created
     * @return
    */ 
 
    template<class CharT, class ExternCharT>
    Impl::iconv_result convert(CharT*& in_pointer, size_t in_size, ExternCharT*& out_pointer, size_t out_size,
            const std::string& from_code, const std::string& to_code)
    {
        iconv_t converter = iconv_open(to_code.c_str(), from_code.c_str());
        if (converter == iconv_t(-1))
        {
            throw Impl::IconvError("Converter opening error: " + Impl::errno_open());
        }
        char* in_pointer_for_conv = (char*)in_pointer;
        char* out_pointer_for_conv = (char*)out_pointer;
        size_t result = iconv(converter, &in_pointer_for_conv, &in_size, &out_pointer_for_conv, &out_size);
        in_pointer = (CharT*)in_pointer_for_conv;
        out_pointer = (ExternCharT*)out_pointer_for_conv;
        if (result == size_t(-1))
        {
            iconv_close(converter);
            if(errno == E2BIG || errno == EINVAL)
                return Impl::iconv_partial;
            return Impl::iconv_error;
        }
        iconv_close(converter);
        return Impl::iconv_ok;
    }
}//namespace Convert
}//namespace Locale
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
26.08.2011, 13:45 3
http://www.boost.org/doc/libs/... decvt.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.08.2011, 13:45
Помогаю со студенческими работами здесь

Парсер, utf-8
Помогите пожалуйста разобраться с кодировкой. Прочитал немного статей и литературы, но полного понимание ситуации с кодировкой так и нет....

Кириллица в UTF-8
Отдельно задам ранее возникший вопрос. При работе с однобайтовой кодировкой (например, в старом борланде 3.1, где, если я правильно понял,...

utf-8 <-> int32
Есть строка s формата utf-8 длины l и число n типа int32 или uint32, которое является уникальным идентификатором строки s. Какие...

C++, UTF-8 и совместимость
Имеется некоторая программа (шутка, прога ещё в проекте). Она по сути является одним из кусков системы общения (пишу себе псевдоИИ, но не...

C++, UTF-8, char
Приветсвую всех. Правильно ли я рассуждаю: 1) Если мне нужно использовать символы юникода в программе (самые немыслимые иероглифы,...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Сопоставление с образцом (Pattern Matching) в Python: Списки и словари
py-thonny 19.03.2025
Программисты любят, когда код говорит сам за себя. Представьте, что вы можете просмотреть структуру данных и мгновенно понять, что с ней делать — без сложных условий и вложенных проверок. Именно эту. . .
Работа с метаданными EXIF и JPEG в JavaScript
run.dev 19.03.2025
Работа с изображениями в веб-разработке нередко выходит за рамки простого отображения картинки. Современные задачи требуют глубокого понимания структуры файлов и умения манипулировать их внутренними. . .
Чеклист для Kubernetes в продакшене: Лучшие практики для SRE
Mr. Docker 19.03.2025
Когда сталкиваешься с запуском Kubernetes в продакшене, невольно задаешься вопросом: почему то, что так гладко работало в тестовой среде, вдруг начинает вызывать головную боль на боевых системах?. . .
Разработка продвинутого ИИ в Unity с использованием Behavior Graph
GameUnited 19.03.2025
В разработке игр искусственный интеллект персонажей часто становится тем элементом, который превращает хорошую игру в выдающуюся. До недавнего времени разработчикам под Unity приходилось либо писать. . .
Словари в Python: методы работы, оптимизация, сериализация
py-thonny 19.03.2025
Каждый хотя бы раз сталкивался с необходимостью хранить связанные данные, где важна не только сама информация, но и их взаимосвязь. В дебрях Python словари — это тот универсальный инструмент, который. . .
Реализация паттерна CQRS с Event Sourcing в PHP
Jason-Webb 19.03.2025
CQRS (Command Query Responsibility Segregation) — это архитектурный паттерн, который разделяет операции чтения и записи данных в приложении. Если вы столкнулись с ситуацией, когда ваше PHP-приложение. . .
std::span в C++: Подпредставлени­я и срезы
NullReferenced 18.03.2025
Если вы когда-нибудь работали с большими объемами данных в C++, то наверняка сталкивались с необходимостью манипулировать отдельными частями массивов или контейнеров. Традиционные подходы часто. . .
std::span в C++: Доступ к элементам и итерирование
NullReferenced 18.03.2025
В C++ каждый разработчик сталкивается с проблемой эффективного управления последовательностями данных. Представьте: вы работаете с массивом, передаете его в функцию, а затем в другую, и каждый раз. . .
Утечки памяти в C#
UnmanagedCoder 18.03.2025
Когда мы говорим о разработке приложений на C#, то часто успокаиваем себя мыслью, что сборщик мусора решит все наши проблемы с памятью. "Память управляется автоматически" — эта мантра прочно засела в. . .
std::span в C++: Введение в невладеющее представление
NullReferenced 18.03.2025
С появлением стандарта C++20 у нас появился новый инструмент — std::span, который представляет собой невладеющее представление для работы с последовательностями данных. std::span — это легковесный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер