Это - функция, которая намного более проста, чем Вы думаете. Хотя могла бы быть функция.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;
}
C ++ поддерживает кодировку символов с помощью std :: locale
и фасета std :: codecvt
. Общая идея состоит в том, что объект locale
описывает аспекты системы, которые могут варьироваться от культуры к культуре, от (человеческого) языка к языку. Эти аспекты разбиты на фасеты
, которые являются аргументами шаблона, которые определяют, как создаются зависящие от локализации объекты (включая потоки ввода-вывода). Когда вы читаете из istream
или записываете в ostream
, фактическая запись каждого символа фильтруется через фасеты локали. Аспекты охватывают не только кодирование типов Unicode, но и такие различные функции, как то, как записываются большие числа (например, с запятыми или точками), валюта, время, использование заглавных букв и множество других деталей.
Однако тот факт, что существуют средства для кодирования, не означает, что стандартная библиотека фактически обрабатывает все кодировки и не упрощает выполнение такого кода. Даже такие элементарные вещи, как размер символа, который вы должны читать (не говоря уже о части кодирования), сложны, поскольку wchar_t
может быть слишком маленьким (искажение ваших данных) или слишком большим (трата места), и наиболее распространенные компиляторы (например, Visual C ++ и Gnu C ++) и различаются по размеру их реализации. Так что обычно вам нужно найти внешние библиотеки для фактического кодирования.
Самый простой пример, который я могу найти, который охватывает все основы, взят из фасета 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
), взгляните на следующее:
ifstream
не заботится о кодировке файла. Он просто читает символы (байты) из файла. wifstream
читает широкие байты ( wchar_t
), но по-прежнему ничего не знает о кодировке файлов. wifstream
достаточно хорош для UCS-2 - кодировки символов фиксированной длины для Unicode (каждый символ представлен двумя байтами).
Вы можете использовать библиотеку IBM ICU для работы с Unicode файлы.
Международный компонент для Unicode (ICU) - это зрелый переносимый набор библиотек C / C ++ и Java для поддержки Unicode, интернационализации программного обеспечения (I18N) и глобализации (G11N), дающий приложениям одинаковые результаты на всех платформах.
ICU выпускается под неограничительной лицензией с открытым исходным кодом, которая подходит для использования как с коммерческим программным обеспечением, так и с другим открытым или бесплатным программным обеспечением.
Дизайн строки широких символов и потока широких символов предшествует UTF-8, UTF-16 и Unicode. Если вы хотите получить техническую информацию, стандартная строка и стандартный поток не обязательно работают с ASCII (просто в основном все компьютеры используют ASCII; у вас потенциально может быть машина EBCDIC).
Рэймонд Чен однажды ] написал серию, показывающую, как работать с различными типами потоков / строк широких символов .