Gibt es so etwas wie "benutzerdefiniertes Encoding Fallback"?

8

Bei Verwendung von ASCII-Codierung und -Codierung von Zeichenfolgen in Bytes ergeben sich Zeichen wie ö in ? .

%Vor%

Ich suche nach einer Möglichkeit, diese Zeichen durch andere zu ersetzen, nicht nur durch ein Fragezeichen.
Beispiele:

%Vor%

Wenn es nicht möglich ist, ein Zeichen durch mehrere zu ersetzen, werde ich akzeptieren, wenn ich sie sogar durch ein Zeichen ersetzen kann ( ö - & gt; o )

Jetzt gibt es mehrere Implementierungen von EncoderFallback , aber ich verstehe nicht, wie sie funktionieren.
Eine schnelle und schmutzige Lösung wäre es, alle diese Zeichen zu ersetzen, bevor die Zeichenfolge Encoding.GetBytes() übergeben wird, aber das scheint nicht der "richtige" Weg zu sein.
Ich wünschte, ich könnte dem Codierungsobjekt eine Ersatztabelle geben.

Wie kann ich das erreichen?

    
joe 04.08.2014, 12:09
quelle

1 Antwort

7

Der "richtigste" Weg, um das zu erreichen, was Sie wollen, ist die Implementierung eines kundenspezifischen Fallback-Encoders, der den bestmöglichen Fallback bietet. Die in .NET integrierte Version ist aus verschiedenen Gründen ziemlich konservativ, in welchen Zeichen sie versuchen wird, am besten zu passen (es gibt Sicherheitsimplikationen, abhängig davon, welche Verwendung Sie für die neu codierte Zeichenfolge verwenden möchten.) Ihre benutzerdefinierte Fallback-Strategie könnte basierend auf den von Ihnen gewünschten Regeln am besten passen.

Nachdem Sie das gesagt haben, werden Sie in Ihrer Fallback-Klasse am Ende eine riesige Case-Anweisung aller nicht codierbaren Unicode-Codepunkte schreiben und sie manuell auf ihre am besten geeigneten Alternativen abbilden. Sie können das gleiche Ziel erreichen, indem Sie Ihre Zeichenfolge vorzeitig durchlaufen und die nicht unterstützten Zeichen austauschen. Der Hauptvorteil der Fallback-Strategie ist die Performance: Sie durchlaufen die Zeichenkette nur einmal und nicht mindestens zweimal. Es sei denn, Ihre Saiten sind riesig, ich würde mich nicht zu sehr darum kümmern.

Wenn Sie eine benutzerdefinierte Fallback-Strategie implementieren möchten, sollten Sie unbedingt den Artikel in meinem Kommentar lesen: Zeichencodierung im .NET Framework . Es ist nicht wirklich schwer, aber Sie müssen verstehen, wie das Coding-Fallback funktioniert.

Sie stellen der Methode Encoder.GetEncoding eine Implementierung Ihrer benutzerdefinierten Klasse zur Verfügung, die von EncoderFallback abgeleitet werden muss. Diese Klasse ist jedoch im Grunde nur ein Wrapper um die eigentliche Arbeit, die in EncoderFallbackBuffer gemacht wird. Der Grund, warum Sie einen Puffer benötigen, ist, dass Fallback nicht notwendigerweise ein Eins-zu-Eins-Prozess ist; In Ihrem Beispiel könnten Sie ein einzelnes Unicode-Zeichen mit zwei ASCII-Zeichen verknüpfen.

An dem Punkt, an dem der Codierungsprozess zuerst auf ein Problem stößt und auf Ihre Strategie zurückgreifen muss, verwendet er Ihre EncoderFallback Implementierung, um eine Instanz von EncoderFallbackBuffer zu erstellen. Dann ruft sie die Methode Fallback Ihres benutzerdefinierten Puffers auf.

Intern erstellt Ihr Puffer eine Menge von Zeichen, die anstelle des nicht codierbaren Zeichen zurückgegeben werden, und gibt true zurück. Von dort ruft der Encoder GetNextChar wiederholt auf, solange Remaining > 0 und / oder bis GetNextChar CP 0 zurückgibt und diese Zeichen in das codierte Ergebnis einfügt.

Der Artikel enthält eine Implementierung von ziemlich genau, was Sie versuchen zu tun; Ich habe das unten stehende Grundgerüst kopiert, das Ihnen den Einstieg erleichtern soll.

%Vor%     
Michael Edenfield 04.08.2014, 13:46
quelle

Tags und Links