wake-up-neo.com

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

Ich habe mich gefragt, ob es eine empfohlene 'cross' Windows- und Linux-Methode gibt, um Strings von UTF-16LE nach UTF-8 zu konvertieren? oder sollte man für jede Umgebung andere 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, wie z.

Jeder kann eine Methode empfehlen, die "Kreuz" wäre, und wenn Sie Referenzen oder einen Leitfaden mit Mustern kennen, würde es sich sehr freuen.

Danke, Doori Bar

23
DooriBar

Vielen Dank, ich habe es geschafft, die "Cross" -Fenster und Linux-Anforderungen zu lösen:

  1. Heruntergeladen und installiert: MinGW und MSYS
  2. Das libiconv-Quellpaket wurde heruntergeladen
  3. libiconv über MSYS kompiliert.

Das ist alles.

0
DooriBar

Wenn Sie ICU nicht verwenden möchten,

  1. Windows: WideCharToMultiByte
  2. Linux: iconv (Glibc)
6
Alex B

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

powershell -Command "Get-Content PATH\temp.txt -Encoding Unicode | Set-Content -Encoding UTF8 PATH2\temp.txt"
6
user4657497

Die Open Source ICU -Bibliothek wird sehr häufig verwendet.

5
Hans Passant

Ich bin auch auf dieses Problem gestoßen, ich löse es mit boost locale library

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;
}

Die Funktion boost :: locale :: conv :: utf_to_utf versucht, aus einem Puffer, der mit UTF-16LE codiert ist, UTF-8 zu konvertieren Die boost :: locale :: conv :: from_utf -Funktion versuchen, aus einem Puffer zu konvertieren, der von UTF-8 nach ANSI codiert wurde. 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 in Linux 4 Bytes lang ist, aber in Windows ist std :: wstring 2 Bytes lang. Daher sollten Sie std :: wstring nicht verwenden, um UTF-16LE-Puffer zu enthalten.

5
Daniel King
wchar_t *src = ...;
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);
4
Remy Lebeau

Es gibt auch utfcpp , eine reine Kopfbibliothek.

2
Kevin Smyth