2016-07-17 24 views
4

私は国の首都を推測する小さなプログラムを作成しています。首都の中にはアクセント、セディーラなどがあります。C - 発音区別記号/アクセント記号を避ける方法

私は首都とユーザーが推測したテキストを比較しなければならないので、アクセントで比較を混乱させたくないので、インターネットをいくつかそれを達成する方法。

私は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は言った:あなたは入力エンコーディングを知る必要があります。あなたの例は、bashの 'LANG = en_US.UTF-8'(Iの代わりにÉをEに置き換えたI C&Pの行)でうまくいきます。あなたはすでに '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をコードしていました。

関連する問題