8 비트 문자를 7 비트 문자로 어떻게 변환합니까? (예 : ü)

StackOverflow https://stackoverflow.com/questions/140422

  •  02-07-2019
  •  | 
  •  

문제

나는 더 높은 비트 ASCII 문자 (예 : ü)를 u (ASCII 85)로 변환하기 위해 의사 코드 또는 샘플 코드를 찾고 있습니다.

나의 초기 추측은 7 비트 ASCII 문자와 유사한 약 25 개의 ASCII 문자가 있기 때문에 번역 배열을 사용해야한다는 것입니다.

다른 것을 생각할 수 있다면 알려주세요.

도움이 되었습니까?

해결책

실제로 실험에 의해 제안 된 바와 같이 : "iconv"함수는 당신을 위해 모든 이상한 변환을 처리하기 위해 존재하며, 거의 모든 프로그래밍 언어로 제공되며 대상 세트에서 누락 된 문자를 근사치로 변환하려는 특별한 옵션이 있습니다.

ICONV를 사용하여 입력 UTF-8 문자열을 7 비트 ASCII로 변환합니다.

그렇지 않으면 항상 코너 케이스를 끝내십시오 : 다른 캐릭터 세트 (따라서 변환 테이블과 전혀 작동하지 않음)가있는 다른 코드 페지를 사용하여 8 비트 입력을 사용하고 마지막으로 어리석은 악센트가있는 카라서 (모든 무덤을 매핑/ 맵핑/ 모든 무덤// 급성 악센트이지만 체코 카론 또는 북유럽 '°') 등을 맵핑하는 것을 잊었습니다.

물론 솔루션을 작은 특정 문제 (음악 컬렉션을위한 파일 시스템 친화적 인 파일 이름 만들기)에 솔루션을 적용하려면 룩업 배열은 이동하는 방법입니다 (128 이상의 각 코드 번호에 대해 128 개가 맵핑됩니다. Jeebee가 제안한 128 세 미만의 근사 또는 선택한 언어로 이미 사용할 수있는 대체 기능에 따라 부회장이 제안한 소스/대상 쌍).

다른 팁

.NET 사용자의 경우 CodeProject의 기사 (감사합니다 GVS의 팁)는 실제로 내가 지금까지 본 다른 어떤 것보다 더 정확하게 질문에 대답합니다.

그러나 해당 기사의 코드 (솔루션 #1)는 번거 롭습니다. 컴팩트 한 버전은 다음과 같습니다.

// 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();
}

답을 조금 확장하기 위해이 방법은 사용합니다. 문자열 어느:

텍스트 값 이이 문자열과 동일한 새 문자열을 반환하지만 이진 표현이 지정된 유니 코드 정규화 형식에 있습니다.

구체적 으로이 경우 우리는 다음을 사용합니다 정규화 형식 FormKD, 동일한 MSDN 문서에 설명 :

formkd- 전체 호환성 분해를 사용하여 유니 코드 문자열이 정규화되었음을 나타냅니다.

유니 코드 정규화 양식에 대한 자세한 내용은 참조하십시오 유니 코드 별관 #15.

대부분의 언어는 악센트 캐릭터를 표준 ASCII로 대체하는 표준 방법을 가지고 있지만 언어에 따라 다르며 종종 단일 악센트가있는 문자를 두 개의 ASCII로 대체하는 것이 포함됩니다. 예를 들어 독일어 ü는 ue가됩니다. 따라서 자연 언어를 올바르게 처리하려면 생각보다 훨씬 더 복잡합니다.

ü를 u로 변환하는 것이 정말로 당신이하고 싶은 일입니까? 나는 다른 언어에 대해 모르지만 독일어에서는 ü가 될 것입니다. Ö는 OE 등이 될 것입니다.

나는 당신이 단지 할 수 없다고 생각합니다.

나는 보통 그런 일을한다 :

AccentString = 'àâäéèê [그리고 다른 모든 것]' '
convertstring = 'aaaeee [및 기타]'

AccentString에서 Char를 찾고 ConvertString에서 동일한 인덱스로 교체

HTH

Code Page 1251에서 숯은 2 바이트로 코딩됩니다. 하나는 기본 숯과 하나는 변형을위한 것입니다. 그런 다음 ASCII로 다시 인코딩하면 기본 숯 만 유지됩니다.

public string RemoveDiacritics(string text)
{

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

}

에서 : http://www.clt-services.com/blog/post/enlever-les-accents-dans-une-chaine-(progrement) .aspx

당신은 그것을 못 박았다고 생각합니다. Char & 127에 의해 색인 된 128 바이트 길이의 바이트 배열은 8 비트 비트 문자에 대해 일치하는 7 비트 특성을 포함합니다.

HM, 왜 문자열의 인코딩을 Iconv로 변경하지 않습니까?

그것은 실제로 소스 문자열의 특성에 달려 있습니다. 문자열의 인코딩을 알고 있고, 8 비트 인코딩 (예 : Iso Latin 1 이상)이라는 것을 알고 있다면 간단한 정적 배열이 충분합니다.

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

반면에, 다른 인코딩이 있거나 UTF-8 인코딩 문자열을 사용하는 경우 ICU 도서관은 매우 도움이됩니다.

에 관한 기사가 있습니다 CodeProject 좋아 보인다.

또한 CodePage 1251을 사용한 전환은 내 관심을 취합니다 (다른 답변 참조).

유니 코드의 문자 수는 쉽게 놓칠 수 있기 때문에 변환 테이블이 마음에 들지 않습니다.

나는 당신이 이미 머리에 못 박 았다고 생각합니다. 제한된 도메인을 감안할 때 변환 배열 또는 해시가 최선의 방법입니다. 자동으로 수행하려는 복잡한 것을 만드는 것은 의미가 없습니다.

조회 배열은 아마도 이것을 달성하는 가장 간단하고 빠른 방법 일 것입니다. 이것은 ASCII를 EBCDIC로 변환 할 수있는 한 가지 방법입니다.

상위 128자는 표준 의미가 없습니다. 사용자의 언어에 따라 다른 해석 (코드 페이지)을 취할 수 있습니다.

예를 들어, 참조하십시오포르투갈 인~ 대프랑스 캐나다

코드 페이지를 알지 않으면 "번역"이 때때로 잘못 될 것입니다.

특정 코드 페이지 (예 : 원본 IBM 코드 페이지)를 가정하려면 번역 배열이 작동하지만 진정한 국제 사용자의 경우 잘못 될 것입니다.

이것이 유니 코드가 이전 코드 페이지 시스템보다 선호되는 이유 중 하나입니다.

엄밀히 말하면, ASCII는 단지 7 비트입니다.

시도해보십시오 uni2ascii 프로그램.

이 기능을 사용하여 악센트가있는 변수를 수정하여 VB6에서 SOAP 함수로 전달됩니다.

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

그리고 비누 기능 내부에서 나는 이것을한다 (가변 파일 이름의 경우) :

FileName = HttpContext.Current.Server.HtmlDecode(FileName)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top