Archive for July, 2011

Update 关于 Mac OS X 的 filesystem encoding

July 25, 2011

跟上一个问题有关。在 stackoverflow 上问了问题,得到了如下答复 [1]:

The problem is that MacOS X’s default filesystem changes all filenames you give it to an unusual normalization form which does not use precomposed characters.

根据 Python unicodedata 的文档 [2]:

The Unicode standard defines various normalization forms of a Unicode string, based on the definition of canonical equivalence and compatibility equivalence. In Unicode, several characters can be expressed in various way. For example, the character U+00C7 (LATIN CAPITAL LETTER C WITH CEDILLA) can also be expressed as the sequence U+0327 (COMBINING CEDILLA) U+0043 (LATIN CAPITAL LETTER C).

其中的 U+00C7 是 ‘Ç’

对应的 python 源代码我也更新了。

请参考:
[1] http://stackoverflow.com/questions/6803621/how-to-prevent-the-command-line-argument-from-being-encoded/6809703#6809703
[2] http://docs.python.org/library/unicodedata.html#unicodedata.normalize

Advertisements

Update 重命名 GBK 乱码文件的 Python 脚本

July 24, 2011

详细的问题描述请见之前两个帖子: [1] [2] 写了一个重命名乱码文件的 Python 脚本,在这里
注意在 Mac OS X 下有点问题,看这里

Update: 关于迅雷离线下载 以及 Windows 的 zip 在 Linux 下乱码

July 23, 2011

现在发觉这两个问题其实是同一个问题,而且找到了更方便简洁的方法去做,主要是利用了 encode(‘latin-1’) 不对 unicode 做任何编码转换而转换为 ascii 字符串。
代码如下:

#!/usr/bin/env python
import sys
for i in sys.argv[1:]:
print i.decode(‘utf8’).encode(‘latin-1’).decode(‘gbk’)

PS. 不知道为什么我用网上介绍的 convmv 做不出来。

关于在 linux 下,用 chrome 下载迅雷离线文件乱码的问题

July 23, 2011

一扯到编码问题就很难说清楚。情况是这样的。迅雷的网页本身是用 UTF-8 编码的,所以在浏览器里显示正常。但是点击下载后,浏览器识别出的文件名却是这么一串:

[ĸÇ×].Mother.mkv

如果在 python 里面 print 出来则是这么一段:

‘[xc3x84xc2xb8xc3x87xc3x97].Mother.mkv’

(原串是 ‘[母亲].Mother.mkv’)。我的用户编码设置是 en_US.UTF-8,如果我设置为 zh_CN.GB18030,则能正确识别出该字串,但是不能保存该文件到硬盘,因为我的 hdd 都是用 UTF-8 编码的。所以猜测是,在 UTF-8 环境下,浏览器读入了 GBK 编码的字串,但是直接理解为了 unicode 的字串,并且直接把它们编码成了 UTF-8。

以’母‘字为例,下面这幅图解释了问题所在:

所以,上面字串中,’xc3x84xc2xb8’对应了‘母’字,而 ‘xc3x87xc3x97’ 对应了’亲‘字。
解决的方法就是把这个过程逆转过来做一次。我用 python 稍微写了一下,稍微有点繁琐,不知道能不能简化。
大致的思路就是,先把非ascii的字符匹配出来,然后每4个作为一个组(代表了一个 GBK 的字符),
然后decode 为 unicode code point。这时的 code point 的 *value* 实质上是 GBK 的字符编码,但因为它是一个 unicode object,因此必须把它转换为一个普通的 str。转换完后,就可以从 GBK decode 为 unicode 了。当然输出时,我们要再 encode 它为 UTF-8。
示例代码在这里

klayout

July 19, 2011

klayout 可以很方便地使用 ruby script 進行操作。 但是 Mac 的 precompiled version 沒有 klayout 這個命令。
事實上,直接調用 /Applications/klayout.app/Contents/MacOS/klayout 即可。
但是如果直接 soft link 會有一個問題,就是pwd的問題,
因爲該app打包了qt,rblib等資源,所以會搜索不到。
解決方法是像 mvim 那樣,寫一個 script 把它包裝起來:

#!/bin/sh

KLAYOUT_APP_DIR=/Applications

binary="$KLAYOUT_APP_DIR/klayout.app/Contents/MacOS/klayout"

exec "$binary" ${1:+"$@"}

links for 2011-07-12

July 12, 2011

links for 2011-07-06

July 6, 2011