문제
나는 더 높은 비트 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로 변환 할 수있는 한 가지 방법입니다.
시도해보십시오 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)