2010-04-12 4 views
12

Wie kann ich verschiedene Unicode-Zeichen in ihre nächsten ASCII-Äquivalente konvertieren? Wie Ä -> A. Ich habe gegoogelt, aber keine passende Lösung gefunden. Der Trick Encoding.ASCII.GetBytes("Ä")[0] hat nicht funktioniert. (Ergebnis war ?).Konvertieren von Unicode-Zeichen in das nächste (ähnlichste) Zeichen in ASCII (.NET)

fand ich, dass es eine Klasse ist Encoder, die eine Fallback Eigenschaft hat, die genau für die Fälle, wenn char nicht konvertiert werden kann, aber Implementierungen (EncoderReplacementFallback) ist dumm und zu ? konvertieren.

Irgendwelche Ideen?

+4

How are you 'am nächsten ascii-Äquivalente' definieren? Akzente entfernen? – mmr

+0

naja ... wenn es irgendeine Definition außer der Konvertierung gibt? Ich würde es gerne :) Ich denke, in Fällen von Akzenten ist es nur entfernen. – Andrey

+0

@mmr: Ich weiß nicht über Andreys beabsichtigte Verwendung, aber ich habe ein Programm, das Text akzeptieren soll und es einem angeschlossenen Gerät geben soll, das es später anzeigen wird. Viele Arten von angeschlossenen Geräten können sich nicht den RAM leisten, der zum Speichern von Multi-Byte-Zeichen erforderlich ist, und könnten sich nicht das ROM leisten, das zum Speichern von mehr als 256 Zeichen erforderlich ist [die meisten Zeichenmatrix-LCD-Module haben ein festes 160-Zeichen set plus die Fähigkeit, acht gleichzeitig benutzerdefinierte 5x7 oder 5x8 Glyphen anzuzeigen]. Rendern aller Nicht-ASCII-Texte als "?" würde unnötig hässlich scheinen. – supercat

Antwort

7

Wenn es nur aus dem diacritical marks entfernen, dann den Kopf auf this answer:

static string RemoveDiacritics(string stIn) { 
    string stFormD = stIn.Normalize(NormalizationForm.FormD); 
    StringBuilder sb = new StringBuilder(); 

    for(int ich = 0; ich < stFormD.Length; ich++) { 
    UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]); 
    if(uc != UnicodeCategory.NonSpacingMark) { 
     sb.Append(stFormD[ich]); 
    } 
    } 

    return(sb.ToString().Normalize(NormalizationForm.FormC)); 
} 
2

MS Dynamics hat ein Problem, bei dem kein Zeichen außerhalb von x20 bis x7f zulässig ist und einige Zeichen innerhalb dieses Bereichs ebenfalls ungültig sind. Meine Antwort war, ein Array mit den ungültigen Zeichen zu erstellen, das die beste Schätzung der gültigen Zeichen liefert.
Es ist nicht schön, aber es funktioniert.

Function PlainAscii(InText) 
Dim i, c, a 
Const cUTF7 = "^[\x20-\x7e]+$" 
Const IgnoreCase = False 
    PlainAscii = "" 
    If InText = "" Then Exit Function 
    If RegExTest(InText, cUTF7, IgnoreCase) Then 
     PlainAscii = InText 
    Else 
     For i = 1 To Len(InText) 
      c = Mid(InText, i, 1) 
      a = Asc(c) 
      If a = 10 Or a = 13 Or a = 9 Then 
       ' Do Nothing - Allow LF, CR & TAB 
      ElseIf a < 32 Then 
       c = " " 
      ElseIf a > 126 Then 
       c = CvtToAscii(a) 
      End If 
      PlainAscii = PlainAscii & c 
     Next 
    End If 
End Function 

Function CvtToAscii(inChar) 
' Maps The Characters With The 8th Bit Set To 7 Bit Characters 
Dim arrChars 
    arrChars = Array(" ", " ", "$", " ", ",", "f", """", " ", "t", "t", "^", "%", "S", "<", "O", " ", "Z", " ", " ", "'", "'", """", """", ".", "-", "-", "~", "T", "S", ">", "o", " ", "Z", "Y", " ", "!", "$", "$", "o", "$", "|", "S", " ", "c", " ", " ", " ", "_", "R", "_", ".", " ", " ", " ", " ", "u", "P", ".", ",", "i", " ", " ", " ", " ", " ", " ", "A", "A", "A", "A", "A", "A", "A", "C", "E", "E", "E", "E", "I", "I", "I", "I", "D", "N", "O", "O", "O", "O", "O", "X", "O", "U", "U", "U", "U", "Y", "b", "B", "a", "a", "a", "a", "a", "a", "a", "c", "e", "e", "e", "e", "i", "i", "i", "i", "o", "n", "o", "o", "o", "o", "o", "/", "O", "u", "u", "u", "u", "y", "p", "y") 
    CvtToAscii = arrChars(inChar - 127) 
End Function 

Function RegExTest(ByVal strStringToSearch, strExpression, IgnoreCase) 
Dim objRegEx 
    On Error Resume Next 
    Err.Clear 
    strStringToSearch = Replace(Replace(strStringToSearch, vbCr, ""), vbLf, "") 
    RegExTest = False 
    Set objRegEx = New RegExp 
    With objRegEx 
     .Pattern = strExpression '//the reg expression that should be searched for 
     If Err.Number = 0 Then 
      .IgnoreCase = CBool(IgnoreCase) '//not case sensitive 
      .Global = True    '//match all instances of pattern 
      RegExTest = .Test(strStringToSearch) 
     End If 
    End With 
    Set objRegEx = Nothing 
    On Error Goto 0 
End Function 

Ihre Antwort wird notwendigerweise anders sein.

+0

ich werd's mir mal anschauen, danke trotzdem – Andrey

Verwandte Themen