2014-01-06 2 views
0

Я использую zipfile-модуль Python для извлечения ZIP-файлов, которые могут содержать файлы с именами файлов Unicode. WinZip и 7-Zip-архивы работают нормально, но WinRAR кодирует имена файлов несколько иначе. Скажем, я создать почтовый файл, содержащий файл с именем "- ★ - 私 -", и извлечь его с этим:Python: Преобразование имен кодовых имен в Unicode в строки

with zipfile.ZipFile(zip_file_path, 'r') as zf: 
    zf.extractall(extract_dir) 

Это экстракты "- ★ - 私 -" как "- # U2605- # U79c1-" , Имя файла объекта ZipInfo не закодировано, это просто обычная строка ASCII, содержащая имя выходного файла.

Я хотел бы перевести строку, содержащую коды U-2605 и U-79C1 кода Unicode, в полезную строку вывода Unicode. Поэтому я написал это, но он не преобразует символы должным образом:

string = codePoints.replace('#U', '\\u').encode('utf-8') 

В любом случае, где я здесь ошибся? Я не получаю тот же результат, я хотел бы получить, если бы я сделал:

string = '-\u2605-\u79c1-'.encode('utf-8') 

(. Предполагая, что Python 3, в Python 2, я бы предварить эту предыдущую строку с "U" характер)

+1

Возможно, это связано с тем, что '\\ u2605' не совпадает с '\ u2605'. – Hyperboreus

+0

Если вы хотите получить хакерство, вы действительно сделаете этот шаг, а затем выполните его шаг, который декодируется кодеком 'unicode_escape' (который превратит все эти' \\ u2605' последовательности в символы '\ u2605') , Конечно, это не удастся, если бы у вас были какие-то фактические символы Юникода (как из более стандартных zip-файлов), поэтому вам нужно сделать фантастический танец, чтобы справиться со всеми тупыми краевыми случаями ... – abarnert

+0

Да, моя ошибка с \ u. – wdep1

ответ

1

I я не уверен, если это то, что вы ищете:

>>> cp = '#U79c1' 
>>> chr(int(cp[2:],16)) 
'私' 

например:

#! /usr/bin/python3 
import re 

def makeNice(s): 
    return re.subn('(#U[0-9a-f]{4})', lambda cp: chr(int(cp.groups()[0][2:],16)), s) [0] 

a = '-#U2605-#U79c1-' 
print(a, makeNice(a)) 

гравюр

-#U2605-#U79c1- -★-私- 
+0

Выглядит отлично, спасибо; Я рассматривал регулярные выражения, но не был уверен, были ли они лучшим решением. Обратите внимание, что unichr() необходимо использовать вместо chr() на Python 2. – wdep1