C语言中土耳其语字符的计数

C语言中土耳其语字符的计数,c,count,character-encoding,C,Count,Character Encoding,我正试图编写一个程序,用土耳其语计算字符串中的所有字符。我不明白为什么这不起作用。我添加了library,setlocale(LC_ALL,“turnic”),但仍然不起作用。非常感谢。这是我的密码: 我的文件字符编码:utf_8 int main(){ setlocale(LC_ALL,"turkish"); char string[9000]; int c = 0, count[30] = {0}; int bahar = 0; ...

我正试图编写一个程序,用土耳其语计算字符串中的所有字符。我不明白为什么这不起作用。我添加了library,setlocale(LC_ALL,“turnic”),但仍然不起作用。非常感谢。这是我的密码: 我的文件字符编码:utf_8

int main(){

    setlocale(LC_ALL,"turkish");
    char string[9000];
    int c = 0, count[30] = {0};
    int bahar = 0;    

    ...
        if ( string[c] >= 'a' && string[c] <= 'z' ){
            count[string[c]-'a']++;
            bahar++;

}
intmain(){
setlocale(土耳其语);
字符串[9000];
int c=0,计数[30]={0};
int-bahar=0;
...

如果(string[c]>='a'&&string[c]解决方案取决于文件的字符编码

如果文件为ISO 8859-9(拉丁语-5),则每个特殊字符仍以单个字节编码,您可以轻松修改代码:您已经在大小写之间有了区分。只需为特殊字符添加更多分支即可


如果文件采用UTF-8或其他unicode编码,则需要一个支持多字节的字符串库。

解决方案取决于文件的字符编码

setlocale(LC_ALL,"turkish");
如果文件为ISO 8859-9(拉丁语-5),则每个特殊字符仍以单个字节编码,您可以轻松修改代码:您已经在大小写之间有了区分。只需为特殊字符添加更多分支即可

如果文件采用UTF-8或其他unicode编码,则需要一个支持多字节的字符串库

setlocale(LC_ALL,"turkish");
第一:
“turkish”
不是语言环境

区域设置的正确名称通常类似于
xx_YY.CHARSET
,其中
xx
是语言的代码,
YY
是国家的代码,
CHARSET
是可选的字符集名称(通常
ISO8859-1
ISO8859-15
,或
UTF-8
)。请注意,并非所有组合都有效;计算机必须为语言代码、国家代码和字符集的特定组合生成区域设置文件

这里您可能需要的是
setlocale(LC\u ALL,“tr\u tr.UTF-8”)


if(string[c]>='a'&&string[c]=

第一:
“turkish”
不是语言环境

区域设置的正确名称通常类似于
xx_YY.CHARSET
,其中
xx
是语言的代码,
YY
是国家的代码,
CHARSET
是可选的字符集名称(通常
ISO8859-1
ISO8859-15
,或
UTF-8
)。请注意,并非所有组合都有效;计算机必须为语言代码、国家代码和字符集的特定组合生成区域设置文件

这里您可能需要的是
setlocale(LC\u ALL,“tr\u tr.UTF-8”)



如果(string[c]>='a'&&string[c]=
因为您显然正在使用UTF-8文件,答案将取决于您的执行平台:

  • 如果您在Linux上,
    setlocale(LC_CTYPE,“en_US.UTF-8”)
    或类似的东西应该可以工作,但重要的是最后的
    UTF-8
    !语言应该不重要。您可以使用

    if (setlocale(LC_CTYPE, "en_US.UTF-8") == NULL) {
        abort();
    }
    
    这将停止程序的执行。该代码之后的任何内容都表示语言环境设置正确

  • 如果您使用的是Windows,则可以使用
    fopen(“myfile.txt”,“rt,ccs=UTF-8”)
    打开该文件。但是,这并不能完全移植到其他平台。但是,它比其他选项干净得多,在这种特殊情况下,这可能更为重要

  • 如果您使用的是FreeBSD或其他系统不允许您使用这两种方法(例如,没有
    UTF-8
    locales),则需要手动解析字节或使用库为您转换它们。如果您的实现具有
    iconv()
    function,您可以使用它将UTF-8转换为ISO-8859-9,以将特殊字符用作单个字节

  • 准备好读取文件后,可以将
    fgetws
    wchar\t
    数组一起使用

    另一个问题是检查是否检测到一个非ASCII字符。您可以执行以下操作:

    // lower = "abcdefghijklmnopqrstuvwxyzçöüğı"
    // upper = "ABCDEFGHİJKLMNOPQRSTUVWXYZÇÖÜĞI"
    const wchar_t lower[] = L"abcdefghijklmnopqrstuvwxyz\u00E7\u00F6\u00FC\u011F\u0131";
    const wchar_t upper[] = L"ABCDEFGH\u0130JKLMNOPQRSTUVWXYZ\u00C7\u00D6\u00DC\u011EI";
    
    const wchar_t *lchptr = wcschr(lower, string[c]);
    const wchar_t *uchptr = wcschr(upper, string[c]);
    if (lchptr) {
        count[(size_t)(lchptr-lower)]++;
        bahar++;
    } else if (uchptr) {
        count[(size_t)(uchptr-upper)]++;
        bahar++;
    }
    
    该代码假定您在计算字符时不考虑大小写(不区分大小写)。也就是说,
    ı
    \u0131
    )和
    I
    被视为相同的字符(
    count[8]++
    ),就像
    İ
    \u0130
    )和
    I
    被视为相同的字符(
    计数[29]+/code>).我不会说我对土耳其语了解得太多,但我在创建大小写字符串时使用了我对土耳其语大小写规则所知甚少的东西

    编辑


    正如@JonathanLeffler在问题评论中提到的,更好的解决方案是使用类似于
    isalpha
    (或者在本例中,
    iswalpha
    )在
    string
    中的每个字符上,而不是我使用的
    lower
    upper
    有效字符字符串。然而,这只会让您知道字符是字母字符;它不会告诉您要使用的
    count
    数组的索引,事实是没有通用的答案要做到这一点,因为有些语言只使用几个带变音符号的字符,而不是整个组,您只需执行
    string[c]>=L'a'&&string[c],因为您显然正在使用UTF-8文件,所以答案将取决于您的执行平台:

  • 如果您在Linux上,
    setlocale(LC_CTYPE,“en_US.UTF-8”)
    或类似的东西应该可以工作,但重要的是最后的
    UTF-8
    !语言应该不重要。您可以使用

    if (setlocale(LC_CTYPE, "en_US.UTF-8") == NULL) {
        abort();
    }
    
    这将停止程序的执行。该代码之后的任何内容都表示语言环境设置正确

  • 如果您使用的是Windows,则可以使用
    fopen(“myfile.txt”,“rt,ccs=UTF-8”)
    打开该文件