13 Stimmen

Gibt es eine integrierte Funktion, die wstring oder wchar_t* in UTF-8 in Linux konvertiert?

Ich möchte wstring in UTF-8-Codierung umwandeln, aber ich möchte die integrierten Funktionen von Linux verwenden.

Gibt es eine integrierte Funktion, die wstring oder wchar_t* in Linux mit einfacher Aufruf in UTF-8 konvertiert?

Beispiel:

wstring str = L"file_name.txt";
wstring mode = "a";
fopen([FUNKTION](str), [FUNKTION](mode)); // Einfacher Aufruf.
cout << [FUNKTION](str); // Einfacher Aufruf.

0 Stimmen

Welche Codierung nehmen Sie für wstring an?

0 Stimmen

Wenn Sie std::string verwenden und dies in der Konsole, dem Linux-Terminal (zumindest auf Ubuntu), ausgeben, wird es standardmäßig als utf-8 interpretiert.

0 Stimmen

@Darcy: Das ist wahr, wenn die aktuelle Sprachumgebung UTF-8 ist, was auf den meisten aktuellen Linux-Distributionen standardmäßig der Fall ist, aber es ist nicht garantiert.

17voto

Cubbi Punkte 44766

Wenn/Ihre Ihr Compiler genügend von C++11 unterstützt, könnten Sie wstring_convert verwenden

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

getestet mit clang++ 2.9/libc++ auf Linux und Visual Studio 2010 auf Windows.

1 Stimmen

Std::wbuffer_convert, std::wstring_convert und das -Header (das std::codecvt_mode, std::codecvt_utf8, std::codecvt_utf16 und std::codecvt_utf8_utf16 enthält) sind in C++17 veraltet. (Die std::codecvt-Klassenvorlage ist NICHT veraltet.)

1 Stimmen

@A.Danesh es war eine aspirative Überholung, wie bei strstreams, die in C++98 veraltet waren, aber immer noch ein obligatorischer Bestandteil von C++20 sind.

8voto

Kerrek SB Punkte 445528

Der C++-Sprachstandard kennt kein explizites Encoding-Konzept. Er enthält nur eine undurchsichtige Vorstellung von einem "System-Encoding", für das wchar_t ein "ausreichend groß" ist.

Um vom undurchsichtigen System-Encoding in ein explizites externes Encoding zu konvertieren, muss eine externe Bibliothek verwendet werden. Die Bibliothek der Wahl wäre iconv() (von WCHAR_T nach UTF-8), die Bestandteil von Posix ist und auf vielen Plattformen verfügbar ist, obwohl auf Windows die Funktion WideCharToMultibyte garantiert UTF-8 erzeugt.

C++11 fügt neue UTF8 Literals in Form von std::string s = u8"Hallo Welt: \U0010FFFF"; hinzu. Diese sind bereits in UTF-8 vorliegend, können aber nicht direkt mit dem undurchsichtigen wstring interagieren, außer auf die von mir beschriebene Weise.

Siehe diese Frage für ein wenig mehr Hintergrundinformationen.

1 Stimmen

C++11's utf-8 strings can interface with wstrings through wstring_convert C++11's utf-8 Strings können über wstring_convert mit WStrings interagieren.

0 Stimmen

@Cubbi: Ich bleibe überzeugt, dass das nichts mit UTF8 zu tun hat. Es scheint nur eine Hülle für wcstombs zu sein. (Es gibt ein Header , das vielversprechender aussieht.)

1 Stimmen

wstring_convert hat nichts mit wcstombs zu tun. Es handelt sich um einen Wrapper für codecvt-Facetten, wie zum Beispiel codecvt_utf8.

2voto

David Heffernan Punkte 585606

Es ist durchaus plausibel, dass wcstombs das tut, was Sie brauchen, wenn Sie tatsächlich von Wide-Characters in die aktuelle Lokale konvertieren möchten.

Wenn nicht, dann müssen Sie wahrscheinlich nach ICU, Boost oder ähnlichem suchen.

0 Stimmen

wcstombs hat keine spezifischen Codierungen. Das ist nicht die Antwort.

1 Stimmen

wcstombs sollte nur funktionieren, wenn die aktuelle Sprachumgebung UTF-8 ist.

-1voto

thiton Punkte 35046

Sicherlich gibt es keine eingebaute Funktion auf Linux, da der Name Linux nur auf den Kernel verweist, der nichts damit zu tun hat. Ich bezweifle ernsthaft, dass die libc, die mit gcc geliefert wird, eine solche Funktion hat, und

$ man -k utf

unterstützt diese Theorie. Es gibt jedoch viele gute UTF-8-Bibliotheken. Ich empfehle persönlich die iconv-Bibliothek für solche Konvertierungen.

1 Stimmen

Deine Suche nach dem Betreiber liegt falsch: Linux glibc hat eine iconv-Implementierung: gnu.org/s/hello/manual/libc/glibc-iconv-Implementation.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X