Frage

Ich suche nach Pseudo-Code oder Beispielcode, höheres Bit-ASCII-Zeichen zu konvertieren (wie, Ü, die erweiterte ascii 154) in U (die ascii 85).

Meine erste Vermutung ist, dass da nur etwa 25 ASCII-Zeichen sind, die ähnlich sind ASCII-Zeichen 7bit, wäre eine Übersetzung Array verwendet werden müssen.

Lassen Sie mich wissen, wenn Sie an nichts anderes denken kann.

War es hilfreich?

Lösung

Tatsächlich, wie durch Unexist vorgeschlagen: „Iconv“ -Funktion gibt es für Sie alle seltsame Umwandlung zu handhaben, ist in fast alle Programmiersprache zur Verfügung und hat eine spezielle Option, die versucht, Zeichen zu konvertieren im Ziel gesetzt, mit Annäherungen fehlen.

Verwenden Sie iconv einfach Ihre Eingabe UTF-8-String umwandeln ASCII 7bit.

Ansonsten sind Sie immer schlägt Ecke Fall beenden: eine Eingabe 8bit einen anderen Zeichensatz mit einem anderen Zeichensatz verwenden (also nicht mit Ihrer Umrechnungstabelle arbeitet), einen letzten dumm akzentuiert caracter zur Karte vergessen hat (Sie kartiert alle Grab / akut, aber vergessen, Tschechische caron oder den nordischen ‚°‘), usw. abzubilden.

Natürlich, wenn Sie die Lösung auf ein kleines spezifisches Problem anwenden mögen (Dateisystem-freundliche Dateinamen für Ihre Musiksammlung zu machen) die der Look-up-Arrays ist der Weg zu gehen (entweder ein Array, das für jede Code-Nummer oben 128 bildet eine Annäherung unter 128, wie durch vIceBerg je nachdem, welche Substitution Funktionen sind bereits in der Sprache Ihrer Wahl) Vorschlag JeeBee oder die Quell- / Zielpaare vorgeschlagen, weil es schnell zusammen gehackt ist und schnell überprüfen Elemente für vermisste.

Andere Tipps

Für .NET-Benutzer der Artikel Codeproject (dank GvS Tipp ) in der Tat die Frage nicht beantworten mehr richtig als jedes andere ich habe gesehen so weit.

Doch der Code in diesem Artikel (in Lösung # 1) ist umständlich. Hier ist eine kompakte Version:

// Based on http://www.codeproject.com/Articles/13503/Stripping-Accents-from-Latin-Characters-A-Foray-in
private static string LatinToAscii(string inString)
{
    var newStringBuilder = new StringBuilder();
    newStringBuilder.Append(inString.Normalize(NormalizationForm.FormKD)
                                    .Where(x => x < 128)
                                    .ToArray());
    return newStringBuilder.ToString();
}

Um ein wenig auf die Antwort zu erweitern, diese Methode verwendet String.Normalize , die:

  

Gibt eine neue Zeichenfolge, deren Textwert ist der gleiche wie dieser Zeichenfolge,   aber deren binäre Darstellung ist, in dem angegebenen Unicode   Normalisierungsform.

Speziell in diesem Fall verwenden wir die NormalizationForm FormKD, in eben dieser MSDN-Dokumentation als solche beschrieben:

  

FormKD - Zeigt an, dass ein Unicode-String normiert ist die volle Kompatibilität Zersetzung mit

.

Weitere Informationen über Unicode-Normalisierung Formen finden Sie unter Unicode Anhang # 15 .

Die meisten Sprachen haben einen Standard akzentuierte Zeichen mit Standard-ASCII zu ersetzen, aber es hängt von der Sprache, und es geht oft ein einzelnes Zeichen mit Akzent mit zwei ASCII zu ersetzen. z.B. in deutscher Sprache ü wird ue. Also, wenn Sie natürliche Sprachen richtig ist es viel komplizierter zu handhaben wollen, als Sie denken es ist.

Ist Umwandlung Ü U wirklich, was Sie tun möchten? Ich weiß nicht, über andere Sprachen, aber in der deutschen Ü würde Ue werden, ö würde oe, etc.

Ich denke, man kann einfach nicht.

ich in der Regel etwas tun, wie folgt aus:

AccentString = 'ÀÂÄÉÈÊ [und alle anderen]'
ConvertString = 'AAAEEE [und alle anderen]

Sie suchen die Zeichen in AccentString und es für den gleichen Index in ConvertString ersetzen

HTH

In Codepage 1251, werden Zeichen mit 2 Bytes codieren: ein für den Grund char und einem für die Variation. Dann, wenn Sie zurück in ASCII kodieren, nur grundlegenden Zeichen gehalten werden.

public string RemoveDiacritics(string text)
{

  return System.Text.Encoding.ASCII.GetString(System.Text.Encoding.GetEncoding(1251).GetBytes(text));

}

Von: http://www.clt-services.com/blog/post/Enlever-les-accents-dans-une-chaine- (proprement) aspx

Sie scheinen genagelt zu haben, es denke ich. Ein 128-Byte-langer Array von Bytes, die von char indexierte und 127, die zusammenpassende 7-Bit-Zeichen für die 8-Bit-Bit-Zeichen enthalten.

Hm, warum nicht nur die Codierung des mit iconv Zeichenfolge ändern?

Es hängt wirklich von der Art Ihrer Quellstrings. Wenn Sie die Zeichenfolge des Codierung wissen, und Sie wissen, dass es eine 8-Bit-Codierung ist - zum Beispiel ISO Latin 1 oder ähnlich - dann eine einfache statische Array genügt:

static const char xlate[256] = { ..., ['é'] = 'e', ..., ['Ü'] = 'U', ... }
...
new_c = xlate[old_c];

Auf der anderen Seite, wenn Sie eine andere Kodierung haben, oder wenn Sie mit UTF-8 kodierten Strings, werden Sie wahrscheinlich die Funktionen in dem ICU Bibliothek sehr hilfreich.

Es ist ein Artikel über Codeproject , das gut aussieht.

Auch die Konvertierung mit Codepage 1251 mein Interesse (siehe andere Antwort) nehmen.

Ich mag nicht die Umrechnungstabellen, da die Anzahl der Zeichen in Unicode ist, dass groß man leicht verpassen.

Ich glaube, Sie schon genagelt es auf dem Kopf. In Anbetracht Ihrer begrenzte Domäne, eine Umwandlung Array oder Hash ist die beste Wahl. Es macht keinen Sinn zu schaffen etwas komplexer versuchen automatisch, es zu tun.

Eine Lookup-Array ist wahrscheinlich die einfachste und schnellste Weg, dies zu erreichen. Dies ist eine Möglichkeit, die Sie umwandeln können beispielsweise ASCII zu EBCDIC.

Die oberen 128 Zeichen haben keine Standardbedeutungen. Sie können unterschiedliche Interpretationen nehmen (Codepages), je nach der Sprache des Benutzers.

Zum Beispiel finden Portugiesisch gegen kanadisches Französisch

Wenn Sie die Codepage wissen, Ihre „Übersetzung“ wird manchmal falsch sein.

Wenn Sie eine bestimmte Codepage zu übernehmen werden (zum Beispiel der ursprüngliche IBM-Codepage) dann eine Übersetzung Array funktioniert, aber für echte internationale Nutzer, wird es falsch sein, eine Menge.

Dies ist ein Grund, warum Unicode über das ältere System von Codeseite begünstigt wird.

Genau genommen ASCII ist nur 7 Bits.

Versuchen Sie, die uni2ascii Programm.

Ich benutze diese Funktion eine Variable mit Akzenten zu beheben, um eine Seife Funktion von VB6 zu übergeben:

Function FixAccents(ByVal Valor As String) As String

    Dim x As Long
    Valor = Replace(Valor, Chr$(38), "&#" & 38 & ";")

    For x = 127 To 255
        Valor = Replace(Valor, Chr$(x), "&#" & x & ";")
    Next

    FixAccents = Valor

End Function

Und in der Seife Funktion, die ich tun dies (für die Variable Dateiname):

FileName = HttpContext.Current.Server.HtmlDecode(FileName)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top