unter Windows mit Visual Studio 2015vergleichen Unicode std :: string mit üblichen "" wörtlichen oder u8 "" declartion
// Ü
// UTF-8 (hex) 0xC3 0x9C
// UTF-16 (hex) 0x00DC
// UTF-32 (hex) 0x000000DC
using namespace std::string_literals;
const auto narrow_multibyte_string_s = "\u00dc"s;
const auto wide_string_s = L"\u00dc"s;
const auto utf8_encoded_string_s = u8"\u00dc"s;
const auto utf16_encoded_string_s = u"\u00dc"s;
const auto utf32_encoded_string_s = U"\u00dc"s;
assert(utf8_encoded_string_s == "\xC3\x9C");
assert(narrow_multibyte_string_s == "Ü");
assert(utf8_encoded_string_s == u8"Ü");
// here is the question
assert(utf8_encoded_string_s != narrow_multibyte_string_s);
"\ u00dc" s ist nicht die gleiche wie u8 "\ u00dc" s oder "Ü" s ist nicht die gleiche wie u8
Anscheinend ist die Standard-Kodierung für üblich String s "Ü" wörtliche ist nicht UTF-8 (wahrscheinlich UTF-16), und ich kann nicht nur zwei vergleichen std :: string ohne zu wissen, dass die Kodierung eve ist n sie haben die gleiche Semantik.
Was ist die Praxis, solche Zeichenfolge Vergleich in Unicode-fähigen C++ - Anwendungsentwicklung zu führen?
Zum Beispiel ein API wie folgt aus:
class MyDatabase
{
bool isAvailable(const std::string& key)
{
// *compare* key in database
if (key == "Ü")
return true;
else
return false;
}
}
Andere Programme aufrufen können isAvailable mit std :: string in UTF-8 oder Standard (UTF-16?) Codierung. Wie kann ich den richtigen Vergleich garantieren?
Kann ich bei der Kompilierungszeit eine Kodierungsabweichung feststellen?
Hinweis: Ich bevorzuge C++ 11/14 Sachen. Antwort std :: string als std :: wstring
UTF-16 wird nur mit 'wstring' verwendet, jede Erwähnung in Ihrer Frage ist definitiv eine falsche Vermutung. Die Standardcodierung ist wahrscheinlich die aktuelle ANSI-Codepage zum Zeitpunkt der Kompilierung. Genauer gesagt, Standard ist keine Neukodierung, die Kodierung der Quelldatei wird beibehalten und zu Zwecken der Grammatikverarbeitung übernimmt der Compiler ANSI. –