当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [问题]关于中文转换乱码的问题
帖子发表于 : 2008-04-01 1:55 

注册: 2008-03-24 23:48
帖子: 4
送出感谢: 0 次
接收感谢: 0 次
今晚遭遇一个问题 是由编码导致的
有一个字典源文件txt格式的,数据排列格式如下
apple[TAB]苹果
map[TAB]地图

使用C自制的程序提取成为 ["apple"]="苹果",["map"]="地图", 这样的格式

选择UTF-8 编码提取成功后的文件 总有一些是乱码。。。
有谁可以指点下么?
下面是我的c程序。。

代码:
#include <cstdlib>
#include <iostream>
#include <map>
#include <string>

using namespace std;

char ToLower(char ch)
{
    switch(ch)
    {
        case '?:
        case '?:
            return 'e';
        case '?:
        case '?:
        case '?:
            return 's';
        case '?:
        case '?:
            return 'c';
        case '?:
        case '?:
            return 'r';
        case '?:
        case '?:
        case '?:
            return 'z';
        case '?:
        case '?:
            return 'y';
        case '?:
        case '?:
            return 'a';
        case '?:
        case '?:
            return 'i';
        case '?:
        case '?:
            return 'e';
        case '?:
        case '?:
        case '?:
            return 'u';

        case '?:
        case '?:
            return 't';
        case '?:
        case '?:
            return 'd';
        case '?:
        case '?:
            return 'n';
        case '?:
        case '?:
            return 'o';
        case '\"':
            return '\'';
        default:
            return tolower(ch);
    }
}

int GetWordCount(const char *p)
{
    int result = 0;
    while (p = strchr(p, ' '))
    {
        ++result;
        while (*p == ' ')
           ++p;
    }
    return result + 1;
}

int main(int argc, char *argv[])
{
//    system("PAUSE");
    FILE *f = fopen("ac.dat", "rt");
    if (!f)
    {
        printf("can't open ac.dat\n");
        exit(1);
    }


    char buffer[1024];

    // build a dictionary
    typedef std::map<std::string, std::string> dictionary_t;
    dictionary_t dictionary;

    while (fgets(buffer, sizeof(buffer), f))
    {
            char *p = strchr(buffer, '\t');
            if (!p)
                continue;
            *p = 0;
           
            char *buf = buffer;

            for (char *b = buf; *b; ++b)
                *b = ToLower(*b);


            if (*buf == 'a' && *(buf + 1) == ' ')
                buf += 2;
               
            if (GetWordCount(buf) > 1)
                continue;
           
            std::string &value = dictionary[buf];
            if (value.size())
                value += "; ";

            ++p;
            char *e = strchr(p, '\n');
            if (e)
                *e = 0;           

            for (char *b = p; *b; ++b)
                *b = ToLower(*b);
           
            value += p;
    }
   
    // output lua code
    printf("dictionary={");

    dictionary_t::const_iterator bi = dictionary.begin(), ei = dictionary.end();
    for (; bi != ei; ++bi)
    {
        printf("[\"%s\"]=\"%s\",", (*bi).first.c_str(), (*bi).second.c_str());
    }
    printf("}\n");
   
   
    return EXIT_SUCCESS;
}
[/quote]


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-04-01 8:52 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
c的处理utf8字符串,需要全套使用gtk的函数,而不是使用c的原始字符串处理函数。看devhelp找吧。
一个utf8中文,对应3-6个字节。自己处理是复杂的。


_________________
● 鸣学


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译