Frage

ein nicht typisierte Zeiger Mit bis zu einem gewissen Puffer zeigen, die entweder ANSI oder Unicode-String halten können, wie kann ich feststellen, ob die aktuelle Zeichenfolge es multibyte hält oder nicht?

War es hilfreich?

Lösung

Es sei denn, der Zeichenfolge enthält selbst Informationen über das Format (zB Kopf- oder eine Bytereihenfolgemarkierung ), dann gibt es keine absolut sichere Art und Weise zu erkennen, ob ein String ANSI oder Unicode ist. Der Windows-API enthält eine Funktion namens IsTextUnicode() , die im Grunde errät, ob ein String ist ANSI oder Unicode, aber dann Sie in dieses Problem laufen, weil Sie gezwungen zu erraten

Warum haben Sie eine nicht typisierte Zeiger auf eine Zeichenfolge in erster Linie? Sie müssen genau wissen, was und wie Sie Ihre Dateninformation darstellt, entweder durch einen typisierte Zeiger in erster Linie mit oder einem ANSI / Unicode-Flag oder etwas bieten. Eine Reihe von Bytes ist bedeutungslos, wenn Sie genau wissen, was es darstellt.

Andere Tipps

Unicode ist nicht eine Codierung, es ist eine Abbildung von Codepunkten zu Zeichen. Die Codierung ist UTF8 oder UCS2, zum Beispiel.

Und da, dass es Null Unterschied zwischen ASCII und UTF-8-Codierung, wenn Sie beschränken sich auf die unteren 128 Zeichen, kann man nicht wirklich sagen, der Unterschied.

Sie würden besser dran, zu fragen, ob es eine Möglichkeit gäbe, den Unterschied zwischen ASCII zu erzählen und einer bestimmten Kodierung von Unicode. Und die Antwort auf diese Frage ist die statistische Analyse, mit der inhärenten Möglichkeit der Ungenauigkeit zu verwenden.

Zum Beispiel, wenn die gesamte Kette von Bytes weniger besteht als 128, es ist ASCII (es könnte sein UTF8, aber es gibt keine Möglichkeit, in diesem Fall und kein Unterschied zu erkennen).

Wenn es hauptsächlich Englisch / Roman ist und besteht aus vielen Zwei-Byte-Sequenzen mit einer Null als einer des Bytes, dann ist es wahrscheinlich UTF16. Und so weiter. Ich glaube nicht, dass es eine narrensichere Methode, ohne tatsächlich einen Indikator für eine Art (z.B. BOM).

ist mein Vorschlag, sich nicht in die Lage zu versetzen, wo Sie zu erraten haben. Wenn der Datentyp kann nicht selbst einen Indikator enthalten, bieten verschiedene Funktionen für ASCII und eine bestimmte Codierung von Unicode. Danach müssen Sie die Arbeit von der Entscheidung über an Ihren Kunden. An einem gewissen Punkt in der Aufrufhierarchie, jemand sollte nun die Codierung.

Oder, noch besser, Graben ASCII zusammen, umarmen die neue Welt und verwenden Unicode ausschließlich. Mit UTF8, ASCII hat genau keine Vorteile gegenüber Unicode: -)

In der Regel können Sie nicht

Sie könnten für das Muster von Nullen überprüfen - nur eine am Ende wahrscheinlich bedeutet, ansi ‚c‘, jedes zweite Byte eine Null bedeutet wahrscheinlich ANSI-Text als UTF16, 3zeros könnte UTF32 sein

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top