делает (w) ifstream, поддерживают различную кодировку

Это - функция, которая намного более проста, чем Вы думаете. Хотя могла бы быть функция.NET, уже существующая для этого, следующая функция (записанный в PHP) делает задание. Не должно быть слишком трудно портировать его.

function ordinal($num) {
    $ones = $num % 10;
    $tens = floor($num / 10) % 10;
    if ($tens == 1) {
        $suff = "th";
    } else {
        switch ($ones) {
            case 1 : $suff = "st"; break;
            case 2 : $suff = "nd"; break;
            case 3 : $suff = "rd"; break;
            default : $suff = "th";
        }
    }
    return $num . $suff;
}
13
задан peterchen 13 August 2009 в 22:21
поделиться

3 ответа

C ++ поддерживает кодировку символов с помощью std :: locale и фасета std :: codecvt . Общая идея состоит в том, что объект locale описывает аспекты системы, которые могут варьироваться от культуры к культуре, от (человеческого) языка к языку. Эти аспекты разбиты на фасеты , которые являются аргументами шаблона, которые определяют, как создаются зависящие от локализации объекты (включая потоки ввода-вывода). Когда вы читаете из istream или записываете в ostream , фактическая запись каждого символа фильтруется через фасеты локали. Аспекты охватывают не только кодирование типов Unicode, но и такие различные функции, как то, как записываются большие числа (например, с запятыми или точками), валюта, время, использование заглавных букв и множество других деталей.

Однако тот факт, что существуют средства для кодирования, не означает, что стандартная библиотека фактически обрабатывает все кодировки и не упрощает выполнение такого кода. Даже такие элементарные вещи, как размер символа, который вы должны читать (не говоря уже о части кодирования), сложны, поскольку wchar_t может быть слишком маленьким (искажение ваших данных) или слишком большим (трата места), и наиболее распространенные компиляторы (например, Visual C ++ и Gnu C ++) и различаются по размеру их реализации. Так что обычно вам нужно найти внешние библиотеки для фактического кодирования.

  • iconv в целом признается правильным, но трудно найти примеры того, как привязать его к механизму C ++.
  • jla3ep упоминает libICU , что очень тщательно, но C ++ API не пытается хорошо работать со стандартом (насколько я могу судить: вы можете просмотреть примеры , чтобы увидеть, можете ли вы добиться большего. )

Самый простой пример, который я могу найти, который охватывает все основы, взят из фасета codecvt Boost UTF-8 , с примером, который специально пытается кодировать UTF-8 (UCS4) для использования IO. потоки. Это выглядит так, хотя я не предлагаю просто копировать его дословно. Чтобы понять это (и я не претендую на это), потребуется немного больше покопаться в источнике :

typedef wchar_t ucs4_t;

std::locale old_locale;
std::locale utf8_locale(old_locale,new utf8_codecvt_facet<ucs4_t>);

...

std::wifstream input_file("data.utf8");
input_file.imbue(utf8_locale);
ucs4_t item = 0;
while (ifs >> item) { ... }

Чтобы понять больше о локали и том, как они используют фасеты (включая codecvt ), взгляните на следующее:

22
ответ дан 1 December 2019 в 21:25
поделиться

ifstream не заботится о кодировке файла. Он просто читает символы (байты) из файла. wifstream читает широкие байты ( wchar_t ), но по-прежнему ничего не знает о кодировке файлов. wifstream достаточно хорош для UCS-2 - кодировки символов фиксированной длины для Unicode (каждый символ представлен двумя байтами).

Вы можете использовать библиотеку IBM ICU для работы с Unicode файлы.

Международный компонент для Unicode (ICU) - это зрелый переносимый набор библиотек C / C ++ и Java для поддержки Unicode, интернационализации программного обеспечения (I18N) и глобализации (G11N), дающий приложениям одинаковые результаты на всех платформах.

ICU выпускается под неограничительной лицензией с открытым исходным кодом, которая подходит для использования как с коммерческим программным обеспечением, так и с другим открытым или бесплатным программным обеспечением.

3
ответ дан 1 December 2019 в 21:25
поделиться

Дизайн строки широких символов и потока широких символов предшествует UTF-8, UTF-16 и Unicode. Если вы хотите получить техническую информацию, стандартная строка и стандартный поток не обязательно работают с ASCII (просто в основном все компьютеры используют ASCII; у вас потенциально может быть машина EBCDIC).

Рэймонд Чен однажды ] написал серию, показывающую, как работать с различными типами потоков / строк широких символов .

1
ответ дан 1 December 2019 в 21:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: