2010-08-04 19 views
7

Kennt jemand eine einfache Möglichkeit, Zeichen in Unicode zu finden, die ASCII-Zeichen ähneln. Ein Beispiel ist die "CYRILLIC SMALL LETTER DZE (ts)". Ich würde gerne nach ähnlichen Zeichen suchen und sie ersetzen. Mit ähnlichen meine ich Menschen lesbar. Sie können keinen Unterschied sehen, wenn Sie es betrachten.Ähnliche ASCII-Zeichen in Unicode finden

Antwort

11

Wie von anderen Kommentatoren erwähnt, wird Unicode normalisation ("Kompatibilitätszeichen") Ihnen hier nicht helfen, da Sie keine offiziellen Äquivalenzen suchen, sondern Ähnlichkeiten in Glyphen (Buchstabenformen). (Der verlinkte technische Unicode-Bericht ist trotzdem lesenswert, da er sehr gut geschrieben ist.)

Wenn ich Sie wäre, um Ihnen die langweilige Arbeit zu ersparen, eine Liste von Charakteren zusammenzustellen, würde ich nach Ressourcen suchen on homograph attacks: Dies ist eine Methode, um Webbenutzer in die Irre zu führen, indem URLs angezeigt werden, die Domainnamen enthalten, in denen einige Buchstaben durch visuell ähnliche Buchstaben ersetzt wurden. Ein weiterer Unicode Technical Report, auf Sicherheit, enthält einen Abschnitt zu dem Problem. Es gibt auch - und das ist vielleicht das, was Sie am meisten brauchen - eine "confusables" table. Hier ist ein weiterer Artikel mit hauptsächlich Interpunktionszeichen, von denen einige ASCII, die visuell ähnliche Gegenstücke in der non-ASCII code tables haben.

Was ich hoffe, ist, dass Sie nicht die Frage stellen, einen solchen Angriff zu konstruieren.

+0

Danke für all die guten Links und Erklärungen. Ich versuche tatsächlich, mich vor solchen Angriffen zu schützen. :-) Und ich denke, ich werde ein paar weitere Sachen mit dem Stichwort "Homograph Attack" finden. – DrDol

+0

Das ist gut zu hören :). Ja, das ist das Schlüsselwort, das du brauchst! Ich habe einen Link bearbeitet (er zeigte auf eine veraltete Version). – chryss

+0

Eine legitime Verwendung: Für Internationalisierungstests habe ich ein Tool, das gefälschten fremdsprachigen Text mit ähnlich aussehenden Zeichen erzeugt. Ein Englisch sprechender Tester kann den "fremden" Text lesen, aber er kann auch klar sagen, dass es kein fest codiertes Englisch ist. Es funktioniert zwar nicht, wenn das Unicode-Zeichen so ähnlich ist, dass Sie den Unterschied nicht unterscheiden können. Ich mache hauptsächlich Dinge wie Akzente zu den Vokalen hinzuzufügen. – Kip

-1

Siehe die Unicode-Datenbank: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt.

Jede Zeile beschreibt eine Unicode-caharacter, zum Beispiel:

1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;; 

Wenn es irgendwelche ähnliche (kompatibel) Zeichen für dieses Symbol, es im <compat> Feld des Eintrags erscheint. In diesem Beispiel ist 0061 (ASCII a) mit dem Unicode-Zeichen LATIN SMALL LETTER A WITH RIGHT HALF RING kompatibel.

Wie für deinen Charakter, der Eintrag ist

0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405 

, die, wie Sie sehen können, keine Kompatibilitätszeichen nicht angeben.

+0

Das Kompatibilitätsfeld beschreibt eine Abfolge von Zeichen, die dasselbe bedeuten wie das betreffende Zeichen. In Ihrem Beispiel wäre die kompatible Sequenz "U + 0061" (der Buchstabe "a"), gefolgt von "U + 02BE" (der Modifikator "Half Ring"). Für Charaktere aus verschiedenen Alphabeten wäre es ziemlich ungewöhnlich, dass es Kompatibilitätssequenzen gibt - und das würde machen, was das OP ohne weitere Informationen unmöglich macht. – cHao

+0

Das OP erklärte "ähnlich wie ASCII-Zeichen", nicht exakt. Wenn Sie nach einem 'a' mit einem rechten Halbring suchen, können Sie sich für ein ASCII 'a' entscheiden, wenn nichts anderes verfügbar ist. – adamk

+0

Einverstanden - in diesem Fall. Aber wenn Sie nach einem ASCII-Zeichen suchen, das einem Kyrillischen ähnlich ist, und # x0455; das ist das Beispiel, das das OP verwendet hat, wird das nicht funktionieren. – cHao

Verwandte Themen