Есть ли встроенная функция, которая конвертирует wstring или wchar_t * в UTF-8 в Linux? - PullRequest
7 голосов
/ 19 сентября 2011

Я хочу преобразовать wstring в кодировку UTF-8, но я хочу использовать встроенные функции Linux.

Существует ли какая-либо встроенная функция, которая преобразует wstring или wchar_t* в UTF-8 в Linux с простым вызовом ?

Пример:

wstring str = L"file_name.txt";
wstring mode = "a";
fopen([FUNCTION](str), [FUNCTION](mode)); // Simple invoke.
cout << [FUNCTION](str); // Simple invoke.

Ответы [ 4 ]

12 голосов
/ 27 сентября 2011

Если / когда ваш компилятор поддерживает достаточно C ++ 11, вы можете использовать wstring_convert

#include <iostream>
#include <codecvt>
#include <locale>
int main()
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> utf8_conv;
    std::wstring str = L"file_name.txt";
    std::cout << utf8_conv.to_bytes(str) << '\n';
}

протестировано с использованием clang ++ 2.9 / libc ++ в Linux и Visual Studio 2010 в Windows.

7 голосов
/ 19 сентября 2011

Стандарт языка C ++ не имеет понятия явного кодирования. Он содержит только непрозрачное понятие «системная кодировка», для которого wchar_t является «достаточно большим» типом.

Чтобы преобразовать непрозрачную системную кодировку в явную внешнюю кодировку, необходимо использовать внешнюю библиотеку. Библиотека выбора будет iconv() (от WCHAR_T до UTF-8), которая является частью Posix и доступна на многих платформах, хотя в Windows функции WideCharToMultibyte гарантированно генерируют UTF8 .

C ++ 11 добавляет новые UTF8 литералы в виде std::string s = u8"Hello World: \U0010FFFF";. Они уже есть в UTF8, но они не могут взаимодействовать с непрозрачным wstring иначе, как я описал.

См. Этот вопрос для получения дополнительной информации.

2 голосов
/ 19 сентября 2011

Вполне вероятно, что wcstombs будет делать то, что вам нужно, если на самом деле вы хотите конвертировать широкие символы в текущую локаль.

Если нет, то вам, вероятно, нужно обратиться к отделению интенсивной терапии, стимуляции или тому подобному.

0 голосов
/ 19 сентября 2011

Конечно, в Linux нет встроенной функции, потому что имя Linux относится только к ядру, которое не имеет к этому никакого отношения. Я серьезно сомневаюсь, что libc, который поставляется с gcc, имеет такую ​​функцию, и

$ man -k utf

поддерживает эту теорию. Но есть много хороших библиотек UTF-8. Я лично рекомендую библиотеку iconv для таких преобразований.

...