免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6477 | 回复: 13
打印 上一主题 下一主题

[C] 编码问题,谁有经验。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-20 19:27 |只看该作者 |倒序浏览
要判断一个字符串是什么编码,经过查询,得出结论是只能猜,不能完全判断。

现在的问题是,猜也不知怎么猜。。firefox的chardet有谁分析过不,有源码也不知怎么用,我真杯具。。。

网上找到一个 universal encode detector,没有文档,也不知怎么用。

有谁有分析过类似的猜字符串编码的经验,分享一下,感激不尽。。

只要能猜出是 utf-16,utf-8,gbk 或是  扩展的 ascii 编码就行了。

最想解决的是判断出 utf-16,求解决方案,谢谢。。。。。。

要是世界上有这么一个东西,我丢一个字符串给他,他返回编码类型,那就完美了。。。

------------------------------------------------ linux C/C++  ------------------------

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
2 [报告]
发表于 2011-04-20 19:51 |只看该作者
本帖最后由 nketc 于 2011-04-22 23:16 编辑

IBM有个开源项目:ICU,这里面有猜测编码的API。

==================
13楼有答案

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
3 [报告]
发表于 2011-04-20 19:52 |只看该作者
著名的Webkit引擎就是用的ICU

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
4 [报告]
发表于 2011-04-20 20:06 |只看该作者
  1.     UCharsetDetector* csd;
  2.     const UCharsetMatch *ucm;
  3.     static char buffer[BUFFER_SIZE] = {....};
  4.     int32_t inputLength = ... //length of the input text
  5.     UErrorCode status = U_ZERO_ERROR;
  6.     ucsdet_setText(csd, buffer, inputLength, &status);
  7.     ucm = ucsdet_detect(csd, &status);
复制代码
  1.     const char *name = ucsdet_getName(ucm, &status);
复制代码
够日的GFW,icu这个网站还在墙外。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
5 [报告]
发表于 2011-04-20 21:23 |只看该作者
iconv可以試驗下,似乎不能猜

论坛徽章:
0
6 [报告]
发表于 2011-04-20 22:19 |只看该作者
判断编码基本只能靠猜啦。不过准确率蛮高的。
iconv或者windows下的编码转换API都可以知道转换失败的。
所以可以随便截一段话,不知道是utf-16,utf-8,gbk没关系,就假设它是,然后转换到另一种编码,如果成功转换了,可能就是它了,如果失败,那就可能不对。当然如果截取的部分比较小或者不具代表性(比如截到“12345”,哪知道是utf8还是gbk),可能多种编码都能通过检验。如果文本不是很规范,也可能全都失败。
如果不考虑计算代价的话,可以把整个文本抓去转换,转换中错误最小的编码就可以认为是该文本的编码了。如果觉得体位还可以再复杂些,还可以加入统计语言模型。如果文本内容是有意义的,长度超过10个字,我相信正确率可以超过99.9%,但如果太短就不太好说了。
我估计猜测编码的API大多也就是这么干的。

论坛徽章:
0
7 [报告]
发表于 2011-04-21 10:28 |只看该作者
可以去看enca的源码

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
8 [报告]
发表于 2011-04-21 21:42 |只看该作者
回复 10# FightForWin


    1) 在icu的源代码目录中执行 configure make make install三部曲
    2)make install之后会在 $prefix/bin 下安装一个 icu-config 文件
    3) 使用 icu-config --cflags --libs 来获取编译需要的头文件搜索路径和库,for example:
        gcc -o test `icu-config --cflags --libs` test.c
    4) 编码猜测,请参考:http://userguide.icu-project.org/conversion/detection

论坛徽章:
0
9 [报告]
发表于 2011-04-22 20:46 |只看该作者
本帖最后由 FightForWin 于 2011-04-22 20:48 编辑
回复  FightForWin


    1) 在icu的源代码目录中执行 configure make make install三部曲
    2)mak ...
nketc 发表于 2011-04-21 21:42


你好,谢谢。
今天试了一下,我把ICU编译安装到 /home/co/program_icu 目录。在program_icu目录有 bin,lib,inclue 文件夹,分别放着二进制可执行文件,动态库文件(.so),程序头文件。
那么我自己写一个测试程序 test.c,用到这一部分代码:

  1.     #include <iostream>
  2. #include <string>
  3. #include <cstdlib>
  4. //  这里很不好,怎么写makefile可以写成 #include "utypes.h"
  5. //或 #include <utypes.h> ,编译器都能找到所有程序中用到的变量定义。
  6. #include "/home/co/install_icu/include/unicode/utypes.h"     
  7. #include "/home/co/install_icu/include/unicode/ucol.h"         
  8. #include "/home/co/install_icu/include/unicode/ustring.h"
  9. #include "/home/co/install_icu/include/unicode/coll.h"

  10.     UCharsetDetector* csd;
  11.     const UCharsetMatch *ucm;
  12.     static char buffer[BUFFER_SIZE] = {....};
  13.     int32_t inputLength = ... //length of the input text
  14.     UErrorCode status = U_ZERO_ERROR;
  15.     ucsdet_setText(csd, buffer, inputLength, &status);
  16.     ucm = ucsdet_detect(csd, &status);
复制代码
我的代码该怎样去引用 我编译安装好的icu库呢? 我编译错误一大堆。都是找不到定义什么的。ICU官网给墙了,没法访问。。。
其实就是不会写makefile:
比如下面是我写的:
  1. OBJS=test.o
  2. edit:$(OBJS)                         # 上面的程序应该要引用相应的库,要怎么引用?
  3.         g++ -o edit $(OBJS)
  4. $(OBJS):test.c
  5. clean:
  6.         rm edit $(OBJS)
复制代码
这样错误很多,问题很多,请原谅啊。。
谢谢。

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
10 [报告]
发表于 2011-04-22 23:11 |只看该作者
回复 12# FightForWin


    还是你V5,include 绝对路径
==================for example===============
1)下载icu4c:wget http://download.icu-project.org/ ... icu4c-4_6_1-src.tgz
2)解包,编译,安装
    2.1) ./configure --prefix=/opt/gtk3 --enable-icuio=no --enable-extras=no --enable-layout=no --enable-tests=no --enable-samples=no
           用不到的功能disable了
    2.2)make  然后 make install
3)配置环境
    3.1)export PKG_CONFIG_PATH=/opt/gtk3/lib/pkgconfig
    3.2)export LD_LIBRARY_PATH=/opt/gtk3/lib
    /opt/gtk3请用configure时指定的 --prefix 替换
    3.3)测试环境
    pkg-config --cflags --libs icu-i18n 应该有如下输出:-I/opt/gtk3/include  -L/opt/gtk3/lib -licui18n -licuuc -licudata
4)编写测试代码
  1. #include <string.h>

  2. #include <unicode/utypes.h>
  3. #include <unicode/ucsdet.h>
  4. #include <unicode/ucnv.h>
  5. #include <unicode/ustring.h>

  6. int main (int argc, char *argv[])
  7. {
  8.   UErrorCode status = U_ZERO_ERROR;
  9.   UCharsetDetector *csd;
  10.   const UCharsetMatch *match;
  11.   const char *name;
  12.   const char *text = "我的代码该怎样去引用 我编译安装好的icu库呢? 我编译错误一大堆。";

  13.   csd = ucsdet_open (&status);

  14.   ucsdet_setText (csd, text, strlen (text), &status);
  15.   if (U_FAILURE(status))
  16.   {
  17.     fprintf(stderr, "error: %s\n", u_errorName (status));
  18.         ucsdet_close (csd);
  19.         return -1;
  20.   }

  21.   match = ucsdet_detect (csd, &status);
  22.   if (!match)
  23.   {
  24.     fprintf(stderr, "detect failed\n");
  25.         ucsdet_close (csd);
  26.         return -1;
  27.   }
  28.   
  29.   name = ucsdet_getName (match, &status);
  30.   printf("detected coding: %s\n", name);

  31.   ucsdet_close (csd);

  32.   return 0;
  33. }
复制代码
5)编译(就这一个文件,犯不着makefile)
     gcc -o test `pkg-config --cflags --libs icu-i18n` test.c
6)测试
    ./test 打印:detected coding: UTF-8
7)over
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP