Differences between revisions 1 and 25 (spanning 24 versions)
Revision 1 as of 2007-02-24 09:24:27
Size: 544
Editor: ZoomQuiet
Comment:
Revision 25 as of 2008-04-29 04:18:01
Size: 12005
Editor: ZoomQuiet
Comment:
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
||'''status'''|| 草稿 || ZoomQuiet || 50%|| ||'''status'''|| 校对 || ZoomQuiet;100% ||
Line 8: Line 8:
= -1 PyDay 实用化,中文! =
'''你碰到的问题99%的情况下其它人已经遇到过了,所以,最佳的解决方式是找到那段别人已经解决了的处置代码!'''

== 回顾缺陷 ==
= CDay -1 实用化,中文! =
~ 中文处理完成功能的实用化


'''你能够碰到的问题,99%的情况下其它人已经遇到过了,所以,最佳的解决方式就是找到那段别人解决相似问题的代码!'''

== 回顾需求 ==

小白已经实现的需求已经到达这般了:
 1. 可以扫描光盘内容并存储为硬盘上的文本文件
  * 存储成*.cdc 的文本文件
  * 可以快速指定保存目录
  * 可以快速指定保存的文件名
 1. 可以根据储存到硬盘上的光盘信息进行搜索
  * 可以搜索指定目录中所有*.cdc文件
  * 可以指定关键字进行搜索
   * 列出所有含有关键字的信息行

=== 进一步 ===
回想起来一直尝试搜索的都是E文关键字,中文的没有试过;

尝试来几下! ... 呜乎矣哉,什么也查不出来!

== 查阅记录文本 ==
attachment:badcdc-chinese.png

'''这种数据对嘛?'''
 * 当初为了简单使用文档中的基本型:{{{#'cdctools.py' 中 cdWalker(cdrom,cdcfile) 的动作
...
    for root, dirs, files in os.walk(cdrom):
        export+="\n %s;%s;%s" % (root,dirs,files)
...
}}}就是使用 `os.walk()` 的天然输出组织成每一行:{{{
/media/cdrom0/EVA/Death-Rebirth;[];['eva8-01.Mp3', 'eva8-02.Mp3',...]
    ^ ^ ^ ^
    | | | +- files列表,此目录的文件名
    | | +- 各个数据段使用";" 分隔
    | +- dirs列表,子目录名,如果没有就为空
    +- 当前目录
}}}
 * 瞧着格式象,为什么到中文的地方就是问号呢?

== 中文!永远的痛 ==
'''不问不知道,一把辛酸泪哪...'''
 * 在网络中一搜索才知道,只要是个中国人,不论整什么开发,中文!永远会遇到各种问题的
 * 幸好比小白勤劳的人海了去,有关中文的Python 处理也是一搜一大堆
 * 但是!`有时候,选择太多也是个问题;-)`

=== 编码问题 ===
attachment:coding.png

 * 有行者给出如上[http://mindmap.fltrp.com/mind-1.htm 思维图谱(Mind Map)]
 * 理解过程中,先使用已知的方式测试本地硬盘文件目录情况
attachment:ipy-try-walk.png
  * 嗯嗯嗯,看着就不同,根据理解继续尝试是否理解
attachment:ipy-try-trans-utf8.png
{{{ unicode(原始文本, 'utf8' ).encode('utf8')
文本 ==decode()--> [unicode] ==>encode()--> utf-8文本
 ^ ^ ^ ^ ^
 | | | | +- 最终的渴求
 | | | +- 是为编码过程;可以从unicode 输出为任意编码
 | | +- Python 内置支持的unicode 格式数据
 | +- 是为解码过程,将已知编码的文本编译成宇宙通用的unicode数据
 +- 原始文本信息,是什么编码你得知道!
}}}

 * 也就是说文件没有编码之说,大家其实都是二进制格式保存在硬盘中的,仅仅是在写入读取时需要使用对应的编码进行处理,以便操作系统配合相关软件/字体绘制到屏幕中给人看
  * 所以,关键问题是得知道原先这些字串数据是使用什么编码来编译的!
  * 但是,在Unicode 之前,都是使用类似对照表的形式来组织编码的,无法从串数据流本身中统一解出不同的文字来,
  * 只有猜!

{{{猜编码函式一
def _smartcode(stream):
    try:
        ustring = unicode(stream, 'gbk')
    except UnicodeDecodeError:
        try:
            ustring = unicode(stream, 'big5')
        except UnicodeDecodeError:
            try:
                ustring = unicode(stream, 'shift_jis')
            except UnicodeDecodeError:
                try:
                    ustring = unicode(stream, 'ascii')
                except:
                    return u"bad unicode encode!"
}}}
 * 嗯嗯嗯,收集的音乐可是不仅仅中文的,印度,伊朗等等音乐都可能有收集,逐一去尝试,这个判定树就太可怕了!
 * 升级!使用Python 的数据对象进行集成!
{{{猜编码函式二
def _smartcode(stream):
    tryuni = ("gbk"
            ,"gb2312"
            ,"gb18030"
            ,"big5"
            ,"shift_jis"
            ,"iso2022_kr"
            ,"iso2022_jp"
            ,"ascii")
    try:
        for type in tryuni:
            try:
                ustring = unicode("%s}"%type+stream, type)
                #try decode by list
            except:
                continue
                #break!continue try decode guess
    except:
        return u"bad unicode encode!"
}}}
 * 但是....

{{{详细::
PCS6 Python与中文
进一步全面的阐述了在Python 中面对中文数据时的思路和技巧...
}}}

=== chardet ===
这么一项项猜,还是显的很傻的哪,万一有些字的高位在不同编码中是相同的,那真的是只能撞大运了!
 * 尤其是对可怜的难兄难弟: `gbk和big5`.
  * 比如:{{{
>>> print '变巨'.decode('big5')
曹操
>>> print '变巨'.decode('gbk')
变巨
}}}

 * 问吧...行者们给出个地址:" http://chardet.feedparser.org/ "
 * -- Character encoding auto-detection 自动字符探测器!
 * 呃真的有哪! 而且是 Mozilla 使用的! 立用不疑!

嗯嗯嗯?!怎么安装外部模块的呢?软件包下载,解开压缩,嗯嗯嗯?没有INSTALL 说明文件,
但是有个`setup.py` 尝试执行一下?

attachment:2008-04-29-112533_install-py-packet_scrot.png
{{{
总用量 33
drwxr-xr-x 3 zoomq zoomq 72 2008-04-29 11:25 build
drwx------ 2 zoomq zoomq 1264 2006-01-11 01:34 chardet
-rwx------ 1 zoomq zoomq 26432 2006-01-11 01:34 COPYING
drwxrwxrwx 4 zoomq zoomq 296 2006-01-11 01:34 docs
-rwx------ 1 zoomq zoomq 1981 2006-01-11 01:34 setup.py
::$ python setup.py
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
   or: setup.py --help [cmd1 cmd2 ...]
   or: setup.py --help-commands
   or: setup.py cmd --help

error: no commands supplied
::$ sudo python setup.py install
running install
running build
running build_py
running install_lib
running install_egg_info
Removing /usr/lib/python2.5/site-packages/chardet-1.0.egg-info
Writing /usr/lib/python2.5/site-packages/chardet-1.0.egg-info
}}}
so easy! 好象使用了类似小白已经完成的交互式提醒哪!
看来所有Python 的软件都可以通过`python setup.py install` 进行安装哪!

{{{详细::
PCS202 chardet
进一步说明了此外部模块的信息,
并分享了使用体验;
}}}

{{{#!python
import chardet
def _smartcode(stream):
    """smart recove stream into UTF-8
    """
    ustring = stream
    codedetect = chardet.detect(ustring)["encoding"]
    print codedetect
    try:
        print ustring
        ustring = unicode(ustring, codedetect)
        print ustring
        return "%s %s"%("",ustring.encode('utf8'))
    except:
        return u"bad unicode encode try!"
}}}

经过测试在各种情况下都可以正确识别!

但是不论怎么尝试已经保存下来的 .cdc 文本依然是 `ASCII` 码!


== 另外思路 ==
也许真的就是 ASCII 码呢?

=== 幸福的自由 ===

 * 冷静一下 -- "既然,文件没有编码都是二进制的,那么光盘文件是如何被系统认识的?!"
 * 在列表中吼了一下,行者们有点无奈的说:"TiosnG!"
  ~ `There is one site named Google!`
 * 好吧,小白老实的搜索了一番,发现了`iso9660` -- 嗯嗯嗯,所有光盘基本都是此文件格式的,同M$使用的 FAT32/ntfs,GNU/Liunx 使用的 ext2/3,Unix使用的UFS...一样,只是种文件系统
 * 则必然是通过某种软件进行转换从而可以访问的
 * 咳 -- Ubuntu 中当然是标准的调用 朴实强大的`mount`命令了
 {{{
$cat /etc/mtab
...
/dev/sda3 /dos vfat rw,utf8,umask=007,gid=46 0 0
...
/dev/sda1 /windows ntfs rw,nls=utf8,umask=007,gid=46 0 0
/dev/scd0 /media/cdrom0 iso9660 ro,noexec,nosuid,nodev,user=zoomq 0 0
...
}}} 观察默认的挂接光盘的行为和挂接 dos 和 windows 分区的情况,感觉是默认的挂接行为没有使用编码处理
 * 那么通过改变挂接行为,应该可以改善读取不到正确文本的情况?!
{{{
#挂接成GBK
$ sudo mount -o ro,norock,iocharset=cp936 /dev/scd0 /media/cdrom0
#挂接成UTF8
$ sudo mount -o ro,norock,iocharset=utf8 /dev/scd0 /media/cdrom0
}}}
 * 咔咔咔!果然!果然!
 * 相对M$ 系统,安装成什么语言的系统,就永远使用什么编码强行挂接光盘的,好象似乎八成应该不是可以轻易的按照你的意愿改门厅的...
 * 以前小白对于自由软件的认识仅仅是免费,难用--这下忽然间有所顿悟,不觉写下感慨:

'''自由软件好,我用我自在!'''
 * 自由之所以,自由是基于对自个儿的了解,真正理解了自个儿想要什么之后,自由软件支持你的一切尝试!哈哈哈!
 * 小白可以感受到这些可以算是`小灰`了,可以稳定的向成熟的`小黑` -- 一名黑客挺进了!

{{{警告::
Hacker~黑客
绝然不是中国媒体中宣传的那些攻击他人电脑的家伙,
黑客是些创造技术奇迹的单纯的人们:
http://wiki.woodpecker.org.cn/moin/HackerHowto

被翻译所误指的是 骇客~Cracker
http://en.wikipedia.org/wiki/Cracker
破坏者
未经授权而企图进入电脑系统者。这种入侵者通常是恶意进入他人的系统,
而且有许多技巧可以破坏他人的系统。
这个名词是骇客(Hacker)在1985年为对抗新闻媒体滥用hacker而提出的。
1981-1982年前曾有人推动使用毛虫代表与cracker一样的意义,但并未成功。
}}}
Line 14: Line 248:

== 中文!永远的痛 ==

=== 确认问题 ===

=== 寻求己有方案 ===
查询是可以了,但是,使用默认的列表打印格式来存储和汇报实在不乍的, 想修改就修改
{{{#!python
#cdctools.py...
def formatCDinfo(root,dirs,files):
    export = "\n"+root+"\n"
    for d in dirs:
        export+= "-d "+root+_smartcode(d)+"\n"
    for f in files:
        export+= "-f %s %s \n" % (root,_smartcode(f))
    export+= "="*70
    return export
}}}

 * 存储下来的 .cdc 片段{{{
...
-f /media/cdrom0/RyokoHirosue/Ryoko Hirosue-files.files title.gif
======================================================================
/media/cdrom0/RyokoHirosue/成长物语
-d /media/cdrom0/RyokoHirosue/成长物语 音乐极限--成长物语.files
-f /media/cdrom0/RyokoHirosue/成长物语 RH991101.mp3
-f /media/cdrom0/RyokoHirosue/成长物语 RH991102.mp3
}}}
 * `d`代表目录;`f`代表文件
 
Line 22: Line 273:
attachment:PyDay-1_think_road.png

这日,小白仅仅解决了一个问题 -- 中文搜索问题;解决尝试路途及相互关系如上图所示
但是,实际上获得了两大方面的进步:
 * 文本编码方面的知识
 * 问题解决的方法论境界提高了一个层次,开始使用系统级别的解决方案

相对Python 方面,仅仅追加了一对内置函式,和一个外部模块包使用的体验

'''关键词''':
 * 编码
 * unicode
 * chardet
 * mount

'''注意'''
 * 如果你使用M$ 系统,运气好的话,是不会见到笔者列出的现象的,但是不保证以后遇不到自动处理下搞不掂的光盘内容;希望那时候小白真的有个自由环境可以尝试其它方案 ;)

{{{警告::
事实上有在Windows 下面的完全Unix环境
Cygwin
http://www.cygwin.com
是一个运行于Windows下的免费的UNIX的子系统,使用一个Dll(动态链接库)来实现的虚拟机,
可以直接在 Windows 环境中使用各种Unix 实用工具;
}}}
Line 24: Line 300:

1. 自动判定你自个儿/或是朋友的Blog 是什么编码的?

2. 如果是非utf-8 的,编写小程序自动将指定文章转换成utf-8 编码保存?

status

校对

ZoomQuiet;100%

TableOfContents

1. CDay -1 实用化,中文!

~ 中文处理完成功能的实用化

你能够碰到的问题,99%的情况下其它人已经遇到过了,所以,最佳的解决方式就是找到那段别人解决相似问题的代码!

1.1. 回顾需求

小白已经实现的需求已经到达这般了:

  1. 可以扫描光盘内容并存储为硬盘上的文本文件
    • 存储成*.cdc 的文本文件
    • 可以快速指定保存目录
    • 可以快速指定保存的文件名
  2. 可以根据储存到硬盘上的光盘信息进行搜索
    • 可以搜索指定目录中所有*.cdc文件
    • 可以指定关键字进行搜索
      • 列出所有含有关键字的信息行

1.1.1. 进一步

回想起来一直尝试搜索的都是E文关键字,中文的没有试过;

尝试来几下! ... 呜乎矣哉,什么也查不出来!

1.2. 查阅记录文本

attachment:badcdc-chinese.png

这种数据对嘛?

  • 当初为了简单使用文档中的基本型:{{{#'cdctools.py' 中 cdWalker(cdrom,cdcfile) 的动作

...

  • for root, dirs, files in os.walk(cdrom):
    • export+="\n %s;%s;%s" % (root,dirs,files)

... }}}就是使用 os.walk() 的天然输出组织成每一行:

/media/cdrom0/EVA/Death-Rebirth;[];['eva8-01.Mp3', 'eva8-02.Mp3',...]
    ^                          ^ ^  ^ 
    |                          | |  +- files列表,此目录的文件名 
    |                          | +- 各个数据段使用";" 分隔
    |                          +- dirs列表,子目录名,如果没有就为空
    +- 当前目录
  • 瞧着格式象,为什么到中文的地方就是问号呢?

1.3. 中文!永远的痛

不问不知道,一把辛酸泪哪...

  • 在网络中一搜索才知道,只要是个中国人,不论整什么开发,中文!永远会遇到各种问题的
  • 幸好比小白勤劳的人海了去,有关中文的Python 处理也是一搜一大堆
  • 但是!有时候,选择太多也是个问题;-)

1.3.1. 编码问题

attachment:coding.png

attachment:ipy-try-walk.png

  • 嗯嗯嗯,看着就不同,根据理解继续尝试是否理解

attachment:ipy-try-trans-utf8.png {{{ unicode(原始文本, 'utf8' ).encode('utf8') 文本 ==decode()--> [unicode] ==>encode()--> utf-8文本

  • ^ | | | | +- 最终的渴求 | | | +- 是为编码过程;可以从unicode 输出为任意编码 | | +- Python 内置支持的unicode 格式数据 | +- 是为解码过程,将已知编码的文本编译成宇宙通用的unicode数据 +- 原始文本信息,是什么编码你得知道!

}}}

  • 也就是说文件没有编码之说,大家其实都是二进制格式保存在硬盘中的,仅仅是在写入读取时需要使用对应的编码进行处理,以便操作系统配合相关软件/字体绘制到屏幕中给人看
    • 所以,关键问题是得知道原先这些字串数据是使用什么编码来编译的!
    • 但是,在Unicode 之前,都是使用类似对照表的形式来组织编码的,无法从串数据流本身中统一解出不同的文字来,
    • 只有猜!

ObpLovelyPython/CDay-1 (last edited 2012-03-03 10:28:10 by ZoomQuiet)