Có một chút đấu tranh với tên tệp Unicode trong OS X và Python. Tôi đang cố gắng sử dụng tên tập tin như là đầu vào cho một biểu thức chính quy sau này trong mã, nhưng mã hóa được sử dụng trong tên tập tin dường như khác với những gì sys.getfilesystemencoding() nói với tôi. Đi đoạn mã sau:Mã hóa Unicode cho hệ thống tập tin trong Mac OS X không chính xác trong Python?
#!/usr/bin/env python
# coding=utf-8
import sys,os
print sys.getfilesystemencoding()
p = u'/temp/s/'
s = u'åäö'
print 's', [ord(c) for c in s], s
s2 = s.encode(sys.getfilesystemencoding())
print 's2', [ord(c) for c in s2], s2
os.mkdir(p+s)
for d in os.listdir(p):
print 'dir', [ord(c) for c in d], d
Nó ra như sau:
utf-8
s [229, 228, 246] åäö
s2 [195, 165, 195, 164, 195, 182] åäö
dir [97, 778, 97, 776, 111, 776] åäö
Vì vậy, hệ thống tập tin mã hóa là utf-8, nhưng khi tôi mã hóa tên tập tin của tôi AAO sử dụng đó, nó sẽ không giống nhau như thể tôi tạo một tên dir với cùng một chuỗi. Tôi hy vọng rằng khi tôi sử dụng chuỗi åäö của tôi để tạo ra một thư mục, và đọc tên của nó trở lại, nó nên sử dụng các mã giống như tôi đã áp dụng mã hóa trực tiếp.
Nếu chúng ta xem xét các điểm mã 97, 778, 97, 776, 111, 776, về cơ bản các ký tự ASCII có dấu phụ được thêm vào, ví dụ: o + ¨ = ö, mà làm cho nó hai nhân vật, không phải một. Làm thế nào tôi có thể tránh sự khác biệt này, là có một chương trình mã hóa trong Python phù hợp với hành vi này của OS X, và tại sao không phải là getfilesystemencoding() cho tôi kết quả đúng?
Hoặc tôi đã sai lầm?
Vấn đề có thể được giải quyết đối với những nhân vật cụ thể, bằng cách làm như sau regexp trên chuỗi tên tập tin để có được chúng vào unicode diacritic ít hơn: 'm_aa = re.compile (ur" a \ u0308 ", re.I), m_ae = re.compile (ur" a \ u030a ", re.I) , m_oe = re.compile (ur "o \ u0308", re.I) – RipperDoc