人在做, 天在看 boxcounter.com boxcounter.org boxcounter[a]boxcounter.org 注册 | 登陆

LibTorrent库的中文支持问题

         这个星期在琢磨BT下载,用的是一套开源的库-libtorrent,接口不错,帮助文档也挺详细,照着文档和测试例子很快就封好了我需要的功能,但是也遇到了很郁闷的问题:中文支持。

         LibTorrent为了支持多平台,使用了Boost做为基础,BoostUNICODE支持做的挺好的,LibTorrent内部也用宏做了Unicode开关,但是又有很多地方直接写死成std::string .....

 

         说回我遇到的问题:

 

         当我的模块存放在包含中文字符的路径下时,新创建的下载目录(由LibTorrent内部进行创建)是乱码。在纯英文路径下,则工作正常。

分析:

         .torrent文件里存放的很多信息是以UTF8编码的方式来存储的,LibTorrent进行解析的时候,将这些UTF8编码存放到了storage::m_files,这个成员的类型是std::string 里,然后在需要的时候转换回wchar_t(具体的可以参考 src\storage.cpp 中的safe_convert(...) 函数相关的操作。      

       我遇到的BUG就是出在这个转换上,我传入的存放路径包含中文字符,LibTorrent.torrent中读取相对文件路径是UTF8LibTorrent将这两块进行拼接,然后再调用safe_convert(...)进行转换,这个函数一看到gbkgb2312?)和UTF8的组合,傻眼了,于是,一个完美的乱码目录就此诞生。

 

         方案一,将我传入的存放路径和.torrent中的相对文件路径分别进行转换,然后再进行拼接。(此笨办法由鄙人设计~,请勿鄙视)

 

         方案二:在源头进行修改,当LibTorrent读取、解析.torrent文件中包含的文件相对路径时(src\file_storage.cpp文件中),进行转换(UTF8 -> gb????)。(目前我的模块使用的方法,一次性解决问题,由黄师父提出)。

 

         刚看了最新的0.14.5版本,该问题仍然存在,希望它能早日全面支持UNICODE。这篇文章专门打了标签,希望能给遇到同样问题的朋友一些帮助 :)

 

         搜索相关资料时,看到不少人都遇到这个问题,有人提出修改safe_convert,并提供了代码,我试过了,对于混合编码的转换无效。这种方法的思路是很好的,也是一次性解决了问题,只是我对不同codepage 的转换不熟,试了半天也没试出个行得通的办法~~~

 

         最后严重感谢黄师父,陪我熬到3点解决了这个问题,赐予我轻松愉快的周末~

 

Tags: libtorrent

« 上一篇 | 下一篇 »

Trackbacks

点击获得Trackback地址,Encode: UTF-8

14条记录访客评论

大哥,我也遇到这种读取种子的问题.我的纯英文的都不可以.我加载的是从BT上下载的.torrent文件.这个有错吗 请大哥指点
我的邮箱是liuzhihong211@126.com

Post by fkd on 2009, August 28, 2:28 PM 引用此文发表评论 #1

引用 fkd 说过的话:
大哥,我也遇到这种读取种子的问题.我的纯英文的都不可以.我加载的是从BT上下载的.torrent文件.这个有错吗 请大哥指点
我的邮箱是liuzhihong211@126.com


你先用手头上的下载工具试试你的 .torrent,如果OK,那就在我文章里说的那几个函数里下断点,看看能不能找到线索。

Post by boxcounter on 2009, August 31, 11:00 PM 引用此文发表评论 #2

[quote=boxcounter][/quote]
大哥 能介绍的研究这个libtorrent的论坛或社团什么的吗??向你致敬!

Post by fkd on 2009, September 8, 3:54 PM 引用此文发表评论 #3

引用 fkd 说过的话:

大哥 能介绍的研究这个libtorrent的论坛或社团什么的吗??向你致敬!


Hi,
我只关注过它的官网和官方的文档,其他的都是遇到问题,随便google、baidu的,没有成体系的第三方资源,抱歉~

还是推荐你编译个debug版的库,然后下断点看~

Post by boxcounter on 2009, September 9, 6:11 PM 引用此文发表评论 #4

呵呵, 现在知道我的问题其实也是libtorrent不支持中文,在种子文件中的中文,解释出来的是乱码.就等大哥你救命了,把你的方案2给我讲详细点,原谅我这个小菜鸟给你带来这么多麻烦.希望你可以发file_storage.cpp到我的邮箱:liuzhihong211@126.com......

Post by fkd on 2009, September 9, 8:06 PM 引用此文发表评论 #5

引用 fkd 说过的话:
呵呵, 现在知道我的问题其实也是libtorrent不支持中文,在种子文件中的中文,解释出来的是乱码.就等大哥你救命了,把你的方案2给我讲详细点,原谅我这个小菜鸟给你带来这么多麻烦.希望你可以发file_storage.cpp到我的邮箱:liuzhihong211@126.com......


已经发给你了

Post by boxcounter on 2009, September 11, 12:14 AM 引用此文发表评论 #6

大哥,我的还有些问题.你编译是哪个版本的.我的是libtorrent-0.14.4. 你能将需要的预编译和把那些代码源文件打包发我吗?谢

Post by fkd on 2009, September 18, 1:52 PM 引用此文发表评论 #7

引用 fkd 说过的话:
大哥,我的还有些问题.你编译是哪个版本的.我的是libtorrent-0.14.4. 你能将需要的预编译和把那些代码源文件打包发我吗?谢


0.14.4 和 0.14.5 我都试过,除了创建种子和中文支持问题外,目前没什么问题。
我的版本就不发给你了,不小,而且我只是在原始源码上修改了两处,都告诉你了。
再者,以后有些问题你会遇到,但是也许我不会,你还是得自己琢磨清楚。

另:
前两天又遇到了一个中文目录的问题,最终的解决方案还是修改safe_convert,你可以参考网上的一段代码,但是那段代码里有错误,你修改修改,中文问题应该就OK了。

还有,那天发给你的那个补丁里,多了一行废代码,是我调试的时候用的,忘了删掉~ 不好意思:
我连续调用了两次setlocale,你把第二个调用删除掉就OK。

Post by boxcounter on 2009, September 18, 5:42 PM 引用此文发表评论 #8

可能是我的预编译指令有问题
TORRENT_BUILDING_SHARED
UNICODE
_UNICODE
_WIN32_WINNT=0x0501
BOOST_ALL_NO_LIB
BOOST_THREAD_USE_LIB
BOOST_BUILD_PCH_ENABLED
TORRENT_DISABLE_ENCRYPTION
TORRENT_DISABLE_RESOLVE_COUNTRIES
TORRENT_DISABLE_GEO_IP
TORRENT_NO_DEPRECATE
NDEBUG
WIN32
WIN32_LEAN_AND_MEAN
__USE_W32_SOCKETS
TORRENT_DISK_STATS
TORRENT_STATS
CMAKE_INTDIR=\"Debug\"
TORRENT_DHT_VERBOSE_LOGGING
TORRENT_VERBOSE_BANDWIDTH_LIMIT
TORRENT_STORAGE_DEBUG
TORRENT_UPNP_LOGGING
TORRENT_USE_OPENSSL
网上提供的预编译各有不同.大哥,那就把你的这个预编译和你文章里提到的帮助文档一起发我吧.十万火急!谢谢
顺便问下,你修改的两处全是在file_storage.cpp里吧
还有网上说封装静态库和动态库有些不同,我封装的是动态库. 好象程序极度不稳定,调试速度不一样报错的地方也不一样.请了公司高手给我调了下,都束手无策,还得请大哥帮我分析.

Post by fkd on 2009, September 21, 11:11 AM 引用此文发表评论 #9

我没有调整预编译指令,直接编译就OK,我用的是静态库。

另:
1. 帮助文档就在开发包里
2. 我已经告诉你要修改的具体函数,和细节,你还要问我是在哪个文件里?
3. 建议你读读“提问的智慧”

Post by boxcounter on 2009, September 21, 1:23 PM 引用此文发表评论 #10

我同样遇到了混合编码,请发一份file_storage.cpp,
谢谢了,QONE1918@163.COM

Post by QONE1918 on 2010, February 25, 10:51 AM 引用此文发表评论 #11

boxcounter,请帮忙搞定一下我的中文路径乱码的问题
我没有做过编码处理的问题,现在是一头雾水,求救!!!

Post by QONE1918 on 2010, March 1, 5:23 PM 引用此文发表评论 #12

大哥,我菜鸟 libtorrent的例子运行起来是什么效果?

Post by jackshen on 2010, March 21, 1:29 AM 引用此文发表评论 #13

boxcounter,您好,我也遇到了混合编码的问题,我需要制作种子和供种的功能,但是都出现了问题。按照网上修改safe_convert方法,发现只要种子文件夹和资源文件夹是中文就没有出现异常,但制作出来的种子内部使用了GBK编码,供种时出现了问题,打不开文件。请给我发一份file_storage.cpp,谢谢了,171161143@qq.com

Post by jason on 2010, April 10, 9:54 AM 引用此文发表评论 #14


发表评论

评论内容 (必填):