2012-02-29 15 views
5

z nazwy pliku, patrząc jak:Python open() Unicode zachowanie filename różnych systemów operacyjnych na całym

filename = u"/direc/tories/español.jpg" 

i korzystania z open() jako:

fp = open(filename, "rb") 

To będzie poprawnie otworzyć plik na OSX (10.7), ale w Ubuntu 11.04 funkcja open() spróbuje otworzyć u"espa\xf1ol.jpg", a to zakończy się niepowodzeniem z IOError.

Przez proces próbowania naprawienia tego, sprawdziłem sys.getfilesystemencoding() na obu systemach, obie są ustawione na UTF-8 (chociaż Ubuntu zgłasza wielkie litery, np. UTF-8, nie jest pewien, czy jest to istotne). W pliku Pythona ustawiłem także # -*- coding: utf-8 -*-, ale jestem pewien, że wpływa to tylko na kodowanie w samym pliku, nie na funkcje zewnętrzne ani na sposób, w jaki Python radzi sobie z zasobami systemowymi. Plik istnieje w obu systemach z prawidłowo wyświetlonym monitorem.

Końcowe pytanie brzmi: Jak otworzyć plik español.jpg w systemie Ubuntu?

Edit: Ciąg español.jpg jest rzeczywiście wychodzi z bazy danych za pośrednictwem ORM Django (ImageFileField), ale do czasu mam do czynienia z nim i zobaczyć różnicę w zachowaniu Mam jeden ciąg znaków Unicode, który jest absolutnym ścieżka do pliku.

+1

Dla tego, co jest warte, '' \ xf1 "' jest reprezentacją ISO-8859-1 '' ñ "'. –

+3

FYI, dotknąłem pliku o nazwie 'español.jpg' i otworzyłem go na swój sposób i działało poprawnie na moim Arch Linux. Czy możesz wkleić dane wyjściowe 'locale' swojego Ubuntu? –

+0

'locale' podaje' en_US.UTF-8' dla wielu parametrów, w tym 'LANG'. – mrmagooey

Odpowiedz

2

Ten poniżej powinny działać w obu przypadkach:

fp = open(filename.encode(sys.getfilesystemencoding()), "rb") 
+0

'sys.getfilesystemencoding' jest trochę kłamstwem: na wielu platformach (patrzę na ciebie, UNIX), system plików nie ma kodowania, ale jest po prostu bajtami. Aplikacje - nie system plików - definiują kodowania używane do reprezentowania nazw plików, jeśli nazwy plików są w ogóle tekstem. –

+2

To nie zadziała w systemie Windows, ponieważ 'getfilesystemencoding' nie raportuje kodowania systemu plików (UTF-16). Nigdy tego nie rób, jeśli chcesz być niezależny od platformy. – Philipp

+1

Ale otrzymuję 'mbcs' na windows przy użyciu' getfilesystemencoding', który poprawnie obsługuje system plików Windows. –

1

To nie wystarczy po prostu ustawić kodowanie pliku na początku pliku. Upewnij się, że twój edytor używa tego samego kodowania i zapisuje tekst w tym kodowaniu. W razie potrzeby ponownie wpisz dowolne znaki spoza zestawu ASCII, aby upewnić się, że twój edytor postępuje właściwie.

Jeśli Twoja wartość pochodzi z np. bazy danych, będziesz musiał upewnić się, że nigdzie wzdłuż linii nie jest zakodowany kod w formacie innym niż Unicode.

+1

+1, proszę sprawdzić ustawienia swojego edytora. –

+0

Przepraszamy, powinienem dodać informacje dotyczące edycji od samego początku, które prawdopodobnie powinny negować problemy z kodowaniem w edytorze ...? – mrmagooey

+0

@mrmagooey: Tak, ale pamiętaj, że nadal musisz upewnić się, że nie kodujesz ciągów w inny sposób, gdzieś wzdłuż linii. – Marcin

Powiązane problemy