c-string und utf8-string
-
hallo leute
wie kann ich zwischen einem c-string und einem utf8-string unterscheiden ?
beide sind ja einconst char*
ich moechte damit funktionen ueberladen, da ich die strings noch umwandeln muss.
einfaches beispiel:
auto post_message(const char *str) -> bool; /* fuer c-strings */ auto post_message(const utf8_char *str) -> bool; /* fuer utf8 strings */ post_message("test"); post_message(u8"test");
wie kann man sowas am besten realisieren ?
Meep Meep
-
utf8_char? Was soll das sein?
Ansonsten: das geht natürlich nicht, da beides char* ist. Das wirst du schon selber im Funktionsnamen unterbringen müssen. Besser wäre es natürlich, sich für genau eine Variante zu entscheiden, das würde das Chaospotential deutlich verringern.
-
wie kann man sowas am besten realisieren ?
Am besten gar nicht. Hoffe darauf, dass alle char-Arrays, die was mit Text zu tun haben, als UTF-8 interpretiert werden dürfen. Das geht lediglich dann schief, wenn Du eine obskure Plattform unterstützen willst, wo das "execution character encoding" nicht UTF-8-kompatibel ist, z.B. EBCDIC).
Auf meinem Laptop, wo Linux drauf läuft, macht das z.B. alles gar keinen Unterschied. Ein aktueller G++ geht davon aus, dass die Quellcode-Kodierung sowie das "execution character encoding" UTF-8 ist, so dass in jedem Fall die Bytes aus der Quellcode-Datei 1:1 übernommen werden können, egal ob Du das u8-Präfix benutzt oder nicht. (Das ist das Default-Verhalten. Es gibt aber entsprechende Optionen, um das zu ändern)
Wie das unter Windows aussieht, weiß ich nicht. Die arbeiten bestimmt noch mit irgendwelchen Codepages. Dann solltest Du bei
"solchen strings hier"
einfach im ASCII-Subset bleiben.Wenn Du es 100%ig korrekt machen und dann die Fälle per Überladungsauflösung unterscheiden können willst, müsstest Du die Kodierung irgendwie als Typ ausdrücken.
Vielleicht so mit 'nem benutzerdefinierten Literal-Operator:
struct utf8_char { unsigned char c; }; static_assert( sizeof(char) == sizeof(utf8_char), "oops" ); const utf8_char* operator""_utf8type(const char* literal, std::size_t) { return reinterpret_cast<const utf8_char*>(literal); } void foo(const char*); // #1 void foo(const utf8_char*); // #2 int main() { foo("x"); // #1 foo(u8"x"_utf8type); // #2 }
So ähnlich wird das auch in Rust gehandhabt. Es gibt verschiedene Kodierungen, die so vom Typ her unterschieden werden.
Aber ob das jetzt in C++ in diesem Fall so sinnvoll ist, weiß ich nicht.
-
wollt grad mal bissl damit rumspielen und haeng am literal operator:
inline const unsigned char* operator""_tt(const char *literal, std::size_t) { return reinterpret_cast<const unsigned char*>(literal); } show_message(u8"test"_tt); // (1)
bei (1) bekomm ich
error C3688: ungültiges Literalsuffix "_tt"; Literaloperator oder Literaloperator-Vorlage "operator ""_tt" nicht gefunden
was hab ich da falsch gemacht ?
Meep Meep
-
hab den fehler gefunden. hab den operator in nen namespace geschrieben
Meep Meep