2016-04-20 20 views
1

Ich würde gerne verstehen, wie reguläre std::string und std::map Operationen mit Unicode-Code-Einheiten beschäftigen, sollten sie in der Zeichenfolge vorhanden sein.Std :: String und Std :: Map-Operationen auf Unicode-String

Beispielcode:

include <iostream> 
    #include "sys/types.h" 

    using namespace std; 

    int main() 
    { 

     std::basic_string<u_int16_t> ustr1(std::basic_string<u_int16_t>((u_int16_t*)"ยฤขฃ", 4)); 
     std::basic_string<u_int16_t> ustr2(std::basic_string<u_int16_t>((u_int16_t*)"abcd", 4)); 

     for (int i = 0; i < ustr1.length(); i++) 
      cout << "Char: " << ustr1[i] << endl; 

     for (int i = 0; i < ustr2.length(); i++) 
      cout << "Char: " << ustr2[i] << endl; 

     if (ustr1 == ustr2) 
      cout << "Strings are equal" << endl; 

     cout << "string length: " << ustr1.length() << "\t" << ustr2.length() << endl; 
     return 0; 
    } 

Die Saiten enthalten Thai Zeichen und ASCII-Zeichen, und die Absicht hinter basic_string<u_int16_t> Verwendung ist die Speicherung von Zeichen zu erleichtern, die nicht innerhalb eines einzelnen Bytes untergebracht werden können. Der Code wurde auf einer Linux-Box ausgeführt, deren Codierungstyp ist. Die Ausgabe lautet:

$ ./a.out 
Char: 47328 
Char: 57506 
Char: 42168 
Char: 47328 
Char: 25185 
Char: 25699 
Char: 17152 
Char: 24936 
string length: 4  4 

Ein paar Fragen:

  1. die Zeichenwerte in der Ausgabe en_US.UTF-8 Codepunkte entsprechen? Wenn nicht, was sind sie?

  2. Würden die std::string Operatoren wie ==, !=, < usw. der Lage sein, mit Unicode-Codepunkten zu arbeiten? Wenn ja, wäre es ein bloßer Vergleich der einzelnen Codestellen an den entsprechenden Stellen? Würde std::map auf ähnlichen Linien arbeiten?

  3. Würde das Ändern der Ländereinstellung in UTF-16 dazu führen, dass die Zeichenfolgen als UTF-16-Codepunkte gespeichert werden?

Vielen Dank!

+0

Warum nutzen Sie nicht 'std :: wstring'? – JVApen

+0

@JVApen: Ich möchte das Verhalten im aktuellen Szenario verstehen. – Maddy

+1

Ihre Umwandlungen von den String-Literalen ('char *') zu 'u_int16_t *' sind unsinnig. – MicroVirus

Antwort

7

Ich mag würde verstehen, wie regelmäßige std::string und std::map Operationen mit Unicode-Codeeinheiten befassen, sollten sie in der Zeichenfolge vorhanden sein.

Sie nicht.

std::string ist eine Folge von char s oder Bytes. Es ist keine "high-level" Zeichenkette, die irgendeine Kodierung berücksichtigt. Sie müssen das selbst tun, z.B. durch Verwenden einer Bibliothek, die diesem Zweck gewidmet ist, wie z. B. ICU.

Ein Wechsel von std::string (d.h. std::basic_string<char>) zu std::basic_char<u_int16_t> ändert das nicht; es bedeutet nur, dass Sie stattdessen eine Folge von "breiten" Zeichen haben.

Und std::map hat damit überhaupt nichts zu tun.

Weiterführende Literatur:

+0

Danke für die Klarstellung. Wenn UTF-16-codierte Strings (die nicht-ASCII-Zeichen enthalten) im 'std :: basic_char ' -Typ gespeichert sind, wie funktionieren die String-Operationen ''=', '! =', '<' Usw.? Ich gehe davon aus, dass sie auf Linux fehlschlagen würden, deren Codierungstyp etwas anderes ist. Aber wenn der Codierungstyp der Zeichenfolge und der Plattform identisch ist, was würde passieren? Wenn die '==' Operation in diesem Fall nicht funktioniert, bin ich gespannt, warum. – Maddy

+0

Ich meinte, wie gehen die String-Operationen * auf * diesen Streichern? – Maddy

+0

@Maddy: Es ist nicht klar, was Sie fragen. Was meinst du damit? Sie fahren ausgezeichnet. Sie führen genau den Vorgang durch, für den sie ausgelegt und spezifiziert sind; das heißt, Operationen einer Sequenz von "char"/"u_int16_t", ohne Rücksicht auf die Codierung überhaupt. Was ich in meiner Antwort gesagt habe. Aber ich verstehe nicht, warum du denkst, dass "==" es niemals schaffen würde, seine Aufgabe der Gleichheitsprüfung zu erfüllen? –

Verwandte Themen