2016-07-17 14 views
4

Я создаю крошечную программу угадывания столиц стран. В некоторых столицах есть акценты, cedillas и т. Д.C - Как избежать диакритических/акцентов чувствительных вопросов

Поскольку мне нужно сравнить капитал и текст, которые пользователь угадал, и я не хочу акцента испортить сравнение, я пошел копать в интернете для некоторых способ выполнения этого.

я наткнулся на бесчисленных решений на другие языки программирования, однако лишь пару результатов о С.

Ни один из них на самом деле работал со мной. Хотя, я пришел к выводу, что мне придется использовать библиотеку wchar.h для работы с этими раздражающими символами.

Я сделал этот крошечный бит кода (который заменяет É на 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: вам нужно знать входную кодировку. Ваш пример хорошо работает с 'LANG = en_US.UTF-8' в bash (I C & P ваша строка", который заменяет É на E "для ввода). Вы уже используете 'setlocale (3)', просто прочитайте вывод и действуйте соответственно (самая сложная часть, если вы спросите меня). – deamentiaemundi

+0

С 'char', я использовал' tolower (toupper (ch)) ', чтобы складывать и складывать снова буквы, похожие на«. Возможно, эквивалент 'wchar_t'? Может быть, 'towctrans()'? – chux

ответ

1

Проблема вы упускать из виду, что É может быть представлен в виде

Вам нужно учитывать это. Это можно сделать, сопоставляя обе строки с NFD (Normal Form: Decomposed). После этого вы можете отделить разложенные комбинирующие символы и оставить их с помощью E, который затем может быть strcmp, как обычно.

Предполагая, что у вас есть UTF-8 кодируются input, вот как вы могли бы сделать это с utf8proc:

#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.