Konvertieren Sie UTF-16 in UTF-8 unter Windows und Linux, in C

Lesezeit: 2 Minuten

Benutzer-Avatar
DooriBar

Ich habe mich gefragt, ob es eine empfohlene „Cross“-Windows- und Linux-Methode zum Konvertieren von Zeichenfolgen von UTF-16LE in UTF-8 gibt. oder sollte man für jede umgebung unterschiedliche methoden verwenden?

Ich habe es geschafft, einige Verweise auf ‘iconv’ zu googeln, aber aus irgendeinem Grund kann ich keine Beispiele für grundlegende Konvertierungen finden, z. B. – Konvertieren eines wchar_t UTF-16 in UTF-8.

Jeder kann eine Methode empfehlen, die “cross” wäre, und wenn Sie Referenzen oder einen Leitfaden mit Beispielen kennen, wäre ich sehr dankbar dafür.

Danke, Doori-Bar

  • Siehe diese vorherige Frage: stackoverflow.com/questions/148403/…

    – Markieren Sie Lösegeld

    20. Mai 2010 um 2:13 Uhr

  • Danke Mark, aber ich fürchte, es ist zu niedrig für mich.

    – DooriBar

    20. Mai 2010 um 12:33 Uhr

Benutzer-Avatar
Benutzer4657497

Ändern Sie die Codierung mit PowerShell in UTF-8:

Get-Content PATH\temp.txt -Encoding Unicode | Set-Content -Encoding UTF8 PATH2\temp.txt

  • Funktioniert hervorragend unter Windows 2008 R2. BOM wird ebenfalls hinzugefügt.

    – Marie B.

    4. Oktober 2016 um 11:51 Uhr

Die offene Quelle Bibliothek der Intensivstation wird sehr häufig verwendet.

Wenn Sie die Intensivstation nicht nutzen möchten,

  1. Fenster: WideCharToMultiByte
  2. Linux: Symbol (Glibc)

Benutzer-Avatar
Rémy Lebeau

#include <iconv.h>

wchar_t *src = ...; // or char16_t* on non-Windows platforms
int srclen = ...;
char *dst = ...;
int dstlen = ...;
iconv_t conv = iconv_open("UTF-8", "UTF-16");
iconv(conv, (char*)&src, &srclen, &dst, &dstlen);
iconv_close(conv);

Ich bin auch auf dieses Problem gestoßen, ich löse es mit Gebietsbibliothek erweitern

try
{           
    std::string utf8 = boost::locale::conv::utf_to_utf<char, short>(
                        (short*)wcontent.c_str(), 
                        (short*)(wcontent.c_str() + wcontent.length()));
    content = boost::locale::conv::from_utf(utf8, "ISO-8859-1");
}
catch (boost::locale::conv::conversion_error e)
{
    std::cout << "Fail to convert from UTF-8 to " << toEncoding << "!" << std::endl;
    break;
}

Das boost::locale::conv::utf_to_utf Funktion versuchen, aus einem Puffer, der von UTF-16LE codiert ist, in UTF-8 zu konvertieren, The boost::locale::conv::from_utf Funktion versuchen, von einem Puffer, der von UTF-8 in ANSI codiert wurde, zu konvertieren, stellen Sie sicher, dass die Codierung richtig ist (hier verwende ich die Codierung für Latin-1, ISO-8859-1).

Eine weitere Erinnerung ist, dass std::wstring unter Linux 4 Bytes lang ist, aber unter Windows std::wstring 2 Bytes lang ist, also sollten Sie std::wstring besser nicht verwenden, um den UTF-16LE-Puffer zu enthalten.

Benutzer-Avatar
MM

Wenn Sie MSYS2 installiert haben, dann die iconv -Paket (das standardmäßig installiert wird) können Sie Folgendes verwenden:

 iconv -f utf-16le -t utf-8 <input.txt >output.txt

Benutzer-Avatar
Kevin Smith

Es gibt auch utfcppbei der es sich um eine Nur-Header-Bibliothek handelt.

1379660cookie-checkKonvertieren Sie UTF-16 in UTF-8 unter Windows und Linux, in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy