2009-06-18 8 views
29

Ich versuche, ein C++ std::string in UTF-8 oder std::wstring zu konvertieren, ohne Informationen zu verlieren (betrachten Sie eine Zeichenfolge, die Nicht-ASCII-Zeichen enthält).Welche Codierung verwendet std :: string.c_str()?

Nach http://forums.sun.com/thread.jspa?threadID=486770&forumID=31:

Wenn die std :: string Nicht-ASCII-Zeichen hat, eine Funktion zur Verfügung stellen müssen, die UTF-8-Codierung aus dem konvertiert [...]

Welche Codierung verwendet std::string.c_str()? Wie kann ich es plattformübergreifend in UTF-8 oder std::wstring konvertieren?

Antwort

35

std::string per se verwendet keine Codierung - es wird die Bytes zurückgeben, die Sie hineinlegen. Zum Beispiel könnten diese Bytes die ISO-8859-1 Kodierung benutzen ... oder irgendwas anderes, wirklich: die Information über die Kodierung ist einfach nicht da - Sie müssen wissen wo die Bytes herkommen!

+0

Also im Wesentlichen gibt es keine Möglichkeit für mich, std :: string zu konvertieren, ohne seine Codierung im Voraus zu wissen? Ich frage, weil ich eine API-Funktion schreibe, die eine std :: string aufnimmt. Ich denke, die Dokumentation muss den Benutzern mitteilen, welches Format übergeben werden soll. – Gili

+3

@Gili, rechts: Sie können eine Byte-Sequenz in einer unbekannten Kodierung nicht zuverlässig in UTF-8 konvertieren (oder irgendetwas anderes ;-). Ich empfehle Ihnen, den Anrufer aufzufordern, UTF-8-Daten zu liefern - die meisten anderen Kodierungen erlauben keine Kodierung _jeder_ mögliche Unicode-Zeichenfolge. Wie @Naaff sagt, ASCII ist ein Spezialfall von UTF-8 (und ISO-8859- * und viele andere Kodierungen), also wenn es in Ihrem Fall ist, gibt es keine Sorgen (eine Fußnote in den Dokumenten erinnert die Benutzer dieser Tatsache könnte _them_ speichern Sorge;-). –

+0

Gute Antwort, danke :) – Gili

7

std::string enthält jede Sequenz von Bytes, so dass die Codierung Ihnen überlassen ist. Sie müssen wissen, wie es codiert ist. Wenn Sie jedoch nicht wissen, dass es etwas anderes ist, ist es wahrscheinlich nur ASCII. In diesem Fall ist es bereits UTF-8-kompatibel.

+12

Ich habe gesehen "es ist wahrscheinlich nur ... "die Ursache für so viele Zeichencodierungsfehler sein. Ich rate nie zu erraten, wenn es um Zeichenkodierungen geht: Sei immer sehr explizit in was du nimmst und was du produzierst. Wenn Sie den Zeichensatz nicht angeben, geben Sie einen zusätzlichen Parameter/Rückgabewert an, um die Codierung anzugeben. – MtnViewMark

Verwandte Themen