Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Boost.Locale: Character Set Conversions

Boost , ,

Character Set Conversions

Convenience Interface

Boost.Locale предоставляетutf,от_utfиutf_to_utfв пространстве имен<boost::locale::conv>. Они являются простыми и удобными функциями для преобразования строки в и из строк UTF-8/16/32 и строк с использованием других кодировок.

Например:

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 в качестве параметра для извлечения из него этой информации. Он также получает параметр политики, который говорит ему, как вести себя, если преобразование не может быть выполнено (т.е. обнаружен незаконный или неподдерживаемый персонаж). По умолчанию эта функция пропускает все незаконные символы и пытается сделать все возможное, однако можно попросить ее бросить исключениеконверсия_ошибка, передав ему флаг<stop>:

std::wstring s=to_utf<wchar_t>("\xFF\xFF","UTF-8",stop);
// Throws because this string is illegal in UTF-8

std::codecvt facet

Повышаю. Locale обеспечивает преобразование потоковой кодовой страницы на основе<std::codecvt>. Это позволяет конвертировать кодировки с широкими символами и 8-битные кодировки, такие как UTF-8, ISO-8859 или Shift-JIS.

Большинство компиляторов предоставляют такие грани, но:

  • Под Windows MSVC не поддерживает кодировки UTF-8.
  • В Linux кодирование поддерживается только в том случае, если генерируются требуемые локальные коды. Например, может быть невозможно создатьhe_IL.CP1255местоимение, даже если доступноhe_ILместоимение.

Таким образом, рост. Locale предоставляет возможность генерировать грани преобразования кода страницы для использования с Boost. Фильтры или фильтры<std::wfstream>. Например:

std::locale loc= generator().generate("he_IL.UTF-8");
std::wofstream file.
file.imbue(loc);
file.open("hello.txt");
file << L"שלום!" << endl;

Создал бы файл<hello.txt>, закодированный как UTF-8, с «שלום!» (шалом) в нем.

Integration with Boost.Iostreams

Вы можете использовать грань<std::codecvt>напрямую, но это довольно сложно и требует точного управления буфером и ошибками.

Вы можете использовать класс<boost::iostreams::code_converter>для ориентированных на поток преобразований между набором широких символов и набором узких локальных символов.

Это примерная программа, которая преобразует широкие в узкие символы для произвольного потока:

#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

Стандарт не предоставляет никакой информации о<std::mbstate_t>, которая может быть использована для сохранения промежуточных состояний преобразования кода страницы. Он оставляет определение до реализации компилятора, что делает невозможным повторное выполнение<std::codecvt<wchar_t,char,mbstate_t>>для кодирования состояния. Так, Буст. Локальная реализация<codecvt>может использоваться с кодированием без состояния, таким как UTF-8, ISO-8859 и Shift-JIS, но не с кодированием без состояния, таким как UTF-7 или SCSU.

Рекомендация:Предпочтите кодировку Unicode UTF-8 для строк и файлов на основе<char>в вашем приложении.

Note

Внедрение кодеков для однобайтовых кодировок, таких как ISO-8859-X и UTF-8, очень эффективно и позволит быстро конвертировать контент, однако его производительность может быть неоптимальной для двухширотных кодировок, таких как Shift-JIS.

Статья Boost.Locale: Character Set Conversions раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 00:25:46/0.004065990447998/0