2016-07-17 6 views
4

나는 국가의 수도를 추측하는 작은 프로그램을 만들고 있습니다. 수도 중 일부는 악센트, 세 디야 등이 있습니다.C - 분음 부호/악센트 구분 문제를 피하는 방법

사용자가 추측 한 대문자와 텍스트를 비교해야하므로 비교를 망칠 악센트가 필요하지 않기 때문에 인터넷을 일부 파기했습니다. 그것을 성취하는 방법.

나는 다른 프로그래밍 언어 실제로 저와 함께 일한 그 중 C.

없음에 대한 결과 그러나 단지 몇 가지에 수많은 솔루션을 가로 질러왔다. 비록 내가 wchar.h 라이브러리를 사용하여 성가신 글자를 다루어야 만한다고 결론지었습니다.

나는이 메소드를 확인하기 위해이 작은 코드 (E를 E로 대체 함)를 작성했습니다. 나는 그것을 읽지 않고 이해하지 못한다. 넓은 숯불 끈을 인쇄하는 것조차 분음 문자를 보여주지 않는다. 그것이 효과가 있었다면 누군가가 나에게 무엇이 잘못되었는지를 말해 주면 고맙겠습니다.

#include<stdio.h> 
#include<locale.h> 
#include<wchar.h> 

const wchar_t CAPITAL_ACCUTE_E = L'\u00C9'; 

int main() 
{ 
    wchar_t wbuff[128]; 
    setlocale(LC_ALL,""); 
    fputws(L"Say something: ", stdout); 
    fgetws(wbuff, 128, stdin); 
    int n; 
    int len = wcslen(wbuff); 
    for(n=0;n<len;n++) 
     if(wbuff[n] == CAPITAL_ACCUTE_E) 
      wbuff[n] = L'E'; 
    wprintf(L"%ls\n", wbuff); 
    return 0; 
} 
+4

표준 C에서 문제가되는 주제입니다. 먼저 플랫폼에서 사용하는 입력 인코딩을 명확히 한 다음 적절한 조치를 취하십시오. – Olaf

+0

@Olaf는 다음과 같이 말했습니다 : 입력 인코딩을 알아야합니다. 당신의 예제는 bash의'LANG = en_US.UTF-8'에서 잘 작동합니다 (입력을 위해 E를 E로 대체하는 "C & P your line"). 당신은 이미'setlocale (3)'을 사용하고 출력을 읽고 이에 따라 행동한다 (당신이 나에게 묻는다면 가장 어려운 부분). – deamentiaemundi

+0

'char'와 함께, 나는 tolower (toupper (ch))를 사용하여 "똑같은"문자를 다시 접을 수 있습니다. 아마도'wchar_t'와 동등할까요? 어쩌면'towctrans()'일까요? – chux

답변

1

당신이 간과하는 문제가 É

이것을 고려해야합니다. 두 문자열을 모두 NFD (Normal Form: Decomposed)에 매핑하여이 작업을 수행 할 수 있습니다. 그런 다음 분해 된 조합 문자를 제거하고 E으로 남겨 둘 수 있습니다. 그런 다음 평소와 같이 strcmp 수 있습니다.

#include <utf8proc.h> 

utf8_t *output; 
ssize_t len = utf8proc_map((uint8_t*)input, 0, &output, 
          UTF8PROC_NULLTERM | UTF8PROC_STABLE | 
          UTF8PROC_STRIPMARK | UTF8PROC_DECOMPOSE | 
          UTF8PROC_CASEFOLD 
         ); 

이 일반 eÉ, ÉE을 모두 켜 것이다 : 당신은 UTF-8를 가지고 가정

다음은 utf8proc 함께 할 수있는 방법이며, input 인코딩.

관련 문제