![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Boost.Locale: Character Set ConversionsBoost , ,
Character Set Conversions Convenience InterfaceBoost.Locale предоставляетutf,от_utfиutf_to_utfв пространстве имен< Например: std::string utf8_string = to_utf<char>(latin1_string,"Latin1");
std::wstring wide_string = to_utf<wchar_t>(latin1_string,"Latin1");
std::string latin1_string = from_utf(wide_string,"Latin1");
std::string utf8_string2 = utf_to_utf<char>(wide_string);
Эта функция может использовать явное кодирующее имя, такое как «Latin1» или «ISO-8859-8», или использовать std::locale в качестве параметра для извлечения из него этой информации. Он также получает параметр политики, который говорит ему, как вести себя, если преобразование не может быть выполнено (т.е. обнаружен незаконный или неподдерживаемый персонаж). По умолчанию эта функция пропускает все незаконные символы и пытается сделать все возможное, однако можно попросить ее бросить исключениеконверсия_ошибка, передав ему флаг< // Throws because this string is illegal in UTF-8
std::codecvt facetПовышаю. Locale обеспечивает преобразование потоковой кодовой страницы на основе< Большинство компиляторов предоставляют такие грани, но:
Таким образом, рост. Locale предоставляет возможность генерировать грани преобразования кода страницы для использования с Boost. Фильтры или фильтры< std::locale loc= generator().generate("he_IL.UTF-8");
std::wofstream file.
file.imbue(loc);
file.open("hello.txt");
file << L"שלום!" << endl;
Создал бы файл< Integration with Boost.IostreamsВы можете использовать грань< Вы можете использовать класс< Это примерная программа, которая преобразует широкие в узкие символы для произвольного потока: #include <boost/iostreams/stream.hpp>
#include <boost/iostreams/categories.hpp>
#include <boost/iostreams/code_converter.hpp>
#include <boost/locale.hpp>
#include <iostream>
namespace io = boost::iostreams;
// Device that consumes the converted text,
// In our case it just writes to standard output
class consumer {
public:
typedef char char_type;
typedef io::sink_tag category;
std::streamsize write(const char* s, std::streamsize n)
{
std::cout.write(s,n);
return n;
}
};
int main()
{
// the device that converts wide characters
// to narrow
typedef io::code_converter<consumer> converter_device;
// the stream that uses this device
typedef io::stream<converter_device> converter_stream;
consumer cons;
// setup out converter to work
// with he_IL.UTF-8 locale
converter_device dev;
dev.imbue(gen("he_IL.UTF-8"));
dev.open(cons);
converter_stream stream;
stream.open(dev);
// Now wide characters that are written
// to the stream would be given to
// our consumer as narrow characters
// in UTF-8 encoding
stream << L"שלום" << std::flush;
}
Limitations of std::codecvtСтандарт не предоставляет никакой информации о< Рекомендация:Предпочтите кодировку Unicode UTF-8 для строк и файлов на основе<
Внедрение кодеков для однобайтовых кодировок, таких как ISO-8859-X и UTF-8, очень эффективно и позволит быстро конвертировать контент, однако его производительность может быть неоптимальной для двухширотных кодировок, таких как Shift-JIS. Статья Boost.Locale: Character Set Conversions раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |