Ich muss jede beliebige Zeichenfolge konvertieren:
zu einem gültigen Java-Bezeichner:
Diese einfache Methode konvertiert jede Eingabezeichenfolge in eine gültige Java-Kennung:
%Vor%Beispiel:
%Vor% Irgendwelche Eingabezeichen werden funktionieren - Fremdsprachenzeichen, Zeilenumbrüche, alles!
Außerdem ist dieser Algorithmus:
str1.equals(str2)
Danke an Joachim Sauer für den UTF-8
suggestion
Wenn Kollisionen OK sind (wo es möglich ist, dass zwei Eingabestrings das gleiche Ergebnis liefern), erzeugt dieser Code eine lesbare Ausgabe:
%Vor%Es behält Zeichen bei, die gültige Bezeichner sind, und konvertiert nur ungültige Werte in ihre Dezimaläquivalente.
Wenn Sie dies für automatisch generierten Code tun (dh, es interessiert mich nicht so sehr um Lesbarkeit) ist einer meiner Favoriten nur Base64 es. Es ist nicht nötig, einen Sprachanwalt darüber zu unterrichten, welche Zeichen in welchen Kodierungen gültig sind, und es ist eine ziemlich übliche Art, willkürliche Byte-Daten zu "schützen".
Bei so vielen Java-Quell-Refactoring- / Generierungs-Frameworks sollte man denken, dass dies eine ziemlich häufige Aufgabe sein sollte.
Eigentlich ist es nicht.
Ein Code-Refactoring-Framework beginnt mit vorhandenen gültigen Java-Kennungen und kann einen neuen Bezeichner generieren, indem er sie mit einigen zusätzlichen Zeichen für Disambiguierungszwecke verkettet.
Ein typisches Codegenerierungsframework beginnt mit "Namen", die aus einem eingeschränkten Zeichensatz stammen. Es muss nicht mit beliebigen Zeichen umgehen.
Ich gehe davon aus, dass das Ziel Ihres Konverters darin besteht, Identifikatoren zu erzeugen, die den Eingabe-Strings ähneln, wenn dies möglich ist. Wenn dies der Fall ist, würde ich die Konvertierung durchführen, indem ich alle Legal-Identifier-Zeichen so wie sie sind und ungültige Bezeichner durch "$ xxxx" ersetzen, wobei "xxxx" eine vierstellige Hexadezimalcodierung des Java-16-Bit-Zeichens ist.
Ihr Schema funktioniert auch, aber das Ersetzen aller ungültigen Zeichen durch '_' führt eher zu Kollisionen mit den Identifikatoren; d. h. wo zwei Eingabezeichenfolgen demselben Bezeichner zugeordnet sind.
Das ist einfach zu programmieren, also überlasse ich es Ihnen.
Tags und Links string java code-generation identifier