2014-09-04 3 views
6

Во время изучения кодировки символов в C и C++ я натолкнулся на два общих способа кодирования: многобайтовые символы и широкие символы. Чтобы укрепить мое понимание этих систем (преимущества и недостатки), я хотел бы привести несколько примеров. Выполнение примеров с широкими символами не является проблемой из-за встроенной поддержки с типом wchar_t. Но когда я хотел создать строку, содержащую так называемые многобайтовые символы, я столкнулся с проблемой.Как создать многобайтовые символы в C

Как я могу создать многобайтовую строку символов, которая использует кодировку, которая работает с массивом символов (с использованием Visual C++)? Такой тип кодирования действительно существует: http://www.gnu.org/software/libc/manual/html_node/Shift-State.html. Но я читал только об этом и никогда не видел реального примера. Или вам нужно создать свою собственную кодировку для такого рода строк?

+0

В qt есть функция tr, которая обрабатывает различия в компиляторах с многобайтовыми строками. Все, что вам нужно сделать, это закодировать исходный файл в utf-8 и вызвать tr со строковыми литералами. –

+1

Вы имеете в виду sth. например '' \ xc3 \ x84 "'? (это немецкий код «Ä» UTF-8) –

+0

@DavidFeurle Я не думаю, что это правильно, 'tr()' есть для i18n (переводы). – Angew

ответ

2

Если вы можете создать строковый литерал с широким символом, просто опустить L должен предоставить вам многобайтовый символьный строковый литерал с определенной кодировкой реализации (gcc имеет возможность выбрать его, я не знаю о визуальном C++).

Если у вас есть широкая строка символов, вы можете получить эквивалентную строку многобайтовой в соответствии с локалью C помощью функции wcstombs<stdlib.h>) и wcsrtombs<wchar.h>).

Система языка C++ также предоставляет способ сделать это преобразование. (Ищите in и out член codecvt, я не буду приводить здесь учебник по их использованию, на сайте cppreference есть примеры кода, например, для out).

Я не уверен, что вы сможете легко найти поддержку в Unix или Windows для кодирования со сдвигом. Вы должны искать кодировку для Китая, Японии, Кореи, Вьетмана (например, ISO 2022-JP, но мне кажется, что Unix, как правило, использует EUC-JP вместо Windows Shift JIS).

Смежные вопросы