2010-04-12 3 views
12

다른 유니 코드 문자를 가장 가까운 ASCII 문자로 변환하려면 어떻게합니까? Ä -> A.처럼 나는 봤지만 적합한 해결책을 찾지 못했습니다. 트릭 Encoding.ASCII.GetBytes("Ä")[0]가 작동하지 않았습니다. 결과는 ?입니다.유니 코드 문자를 ASCII (.NET)에서 가장 가까운 (가장 비슷한) 문자로 변환

내가 거기 char 변환 할 수없는 경우 경우에 정확하게 인 Fallback 속성이 클래스 Encoder이지만, 구현 (EncoderReplacementFallback는) 바보와 ?로 변환 것을 발견했다.

아이디어가 있으십니까?

+4

당신이 '가장 가까운 아스키 등가물'를 정의하는 방법은? 그냥 악센트 부호를 제거 하시겠습니까? – mmr

+0

음 ... 변환하는 것을 제외하고는 어떤 정의가 있습니까? 나는 그것을 좋아할 것이다 : 나는 그것이 단지 제거하고있는 악센트의 경우에 생각한다. – Andrey

+0

@ mmr : Andrey의 의도 된 사용법에 대해서는 잘 모릅니다.하지만 텍스트를 받아 들여 나중에 첨부 된 장치에 제공하는 프로그램이 있습니다. 많은 종류의 부착 된 장치는 멀티 바이트 문자를 저장하는 데 필요한 RAM을 제공 할 수 없으며 256 자 이상의 문자 모양을 저장할 필요가 없습니다 [대부분의 문자 매트릭스 LCD 모듈은 고정 된 160 자 8 개의 맞춤형 5x7 또는 5x8 글리프를 동시에 표시 할 수있는 기능이 추가되었습니다.] 모든 비 ASCII 텍스트를 "?"로 렌더링합니다. 불필요하게 추한 것처럼 보일 것입니다. – supercat

답변

7

, 다음 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는 x20에서 x7f 이외의 문자를 허용하지 않으며 해당 범위 내의 일부 문자도 유효하지 않은 문제가 있습니다. 내 대답은 올바른 문자의 최상의 추측을 반환하는 잘못된 문자 키를 배열을 만드는 것입니다.
예쁜 것은 아니지만 작동합니다.

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 

귀하의 답변은 반드시 달라질 수 있습니다. 그것은 단지 diacritical marks의 제거되면

+0

어쨌든 고맙습니다. – Andrey