亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 6512 | 回復: 13
打印 上一主題 下一主題

[C] 編碼問題,誰有經(jīng)驗。。 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-04-20 19:27 |只看該作者 |倒序瀏覽
要判斷一個字符串是什么編碼,經(jīng)過查詢,得出結論是只能猜,不能完全判斷。

現(xiàn)在的問題是,猜也不知怎么猜。。firefox的chardet有誰分析過不,有源碼也不知怎么用,我真杯具。。。

網(wǎng)上找到一個 universal encode detector,沒有文檔,也不知怎么用。

有誰有分析過類似的猜字符串編碼的經(jīng)驗,分享一下,感激不盡。。

只要能猜出是 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 [報告]
發(fā)表于 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 [報告]
發(fā)表于 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 [報告]
發(fā)表于 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這個網(wǎng)站還在墻外。

論壇徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
5 [報告]
發(fā)表于 2011-04-20 21:23 |只看該作者
iconv可以試驗下,似乎不能猜

論壇徽章:
0
6 [報告]
發(fā)表于 2011-04-20 22:19 |只看該作者
判斷編碼基本只能靠猜啦。不過準確率蠻高的。
iconv或者windows下的編碼轉換API都可以知道轉換失敗的。
所以可以隨便截一段話,不知道是utf-16,utf-8,gbk沒關系,就假設它是,然后轉換到另一種編碼,如果成功轉換了,可能就是它了,如果失敗,那就可能不對。當然如果截取的部分比較小或者不具代表性(比如截到“12345”,哪知道是utf8還是gbk),可能多種編碼都能通過檢驗。如果文本不是很規(guī)范,也可能全都失敗。
如果不考慮計算代價的話,可以把整個文本抓去轉換,轉換中錯誤最小的編碼就可以認為是該文本的編碼了。如果覺得體位還可以再復雜些,還可以加入統(tǒng)計語言模型。如果文本內(nèi)容是有意義的,長度超過10個字,我相信正確率可以超過99.9%,但如果太短就不太好說了。
我估計猜測編碼的API大多也就是這么干的。

論壇徽章:
0
7 [報告]
發(fā)表于 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 [報告]
發(fā)表于 2011-04-21 21:42 |只看該作者
回復 10# FightForWin


    1) 在icu的源代碼目錄中執(zhí)行 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 [報告]
發(fā)表于 2011-04-22 20:46 |只看該作者
本帖最后由 FightForWin 于 2011-04-22 20:48 編輯
回復  FightForWin


    1) 在icu的源代碼目錄中執(zhí)行 configure make make install三部曲
    2)mak ...
nketc 發(fā)表于 2011-04-21 21:42


你好,謝謝。
今天試了一下,我把ICU編譯安裝到 /home/co/program_icu 目錄。在program_icu目錄有 bin,lib,inclue 文件夾,分別放著二進制可執(zhí)行文件,動態(tài)庫文件(.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官網(wǎng)給墻了,沒法訪問。。。
其實就是不會寫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 [報告]
發(fā)表于 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)配置環(huán)境
    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)測試環(huán)境
    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 打。篸etected coding: UTF-8
7)over
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP