Wie konvertiert man eine beliebige Zeichenkette in eine Java-ID?

8

Ich muss jede beliebige Zeichenfolge konvertieren:

  • Zeichenfolge mit Leerzeichen
  • 100stringsstartswithnummer
  • Zeichenfolge € mit% special † Zeichen / \!
  • [leere Zeichenfolge]

zu einem gültigen Java-Bezeichner:

  • string_with_spaces
  • _100stringsstartswithnummer
  • string_with_special_characters
parxier 16.09.2011, 06:08
quelle

4 Antworten

10

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:

  • reproduzierbar
  • unique - dh werden immer und nur dasselbe Ergebnis erzeugt, wenn str1.equals(str2)
  • reversibel

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.

    
Bohemian 16.09.2011, 06:23
quelle
3

Ich kenne kein Tool für diesen Zweck, aber es kann einfach mit der Klasse Character erstellt werden.

Wussten Sie, dass die Zeichenfolge € with_special_characters

stacker 16.09.2011 06:39
quelle
1

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".

    
Steven Schlansker 16.09.2011 07:12
quelle
1
  

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.

    
Stephen C 16.09.2011 07:13
quelle