2013-06-10 2 views
0

У меня проблема с символами unicode, которые немного перепутаны. У меня есть файл конфигурации, который поставляет мне переменную location. Файл конфигурации имеет # -*- coding utf-8 -*- вверху, но file -bi config-file-name сообщает мне, что кодировка us-ascii и независимо от того, что я делаю (включая iconv и recode (linux)), он отказывается это изменить.Я теряю символы Unicode где-то (Python3)

В любом случае, я извлекаю некоторые данные с символами unicode в них (передается как input_data ниже), и данные выглядят отлично, когда я смотрю на него напрямую. Однако, где-то в следующем жую его:

def make_message(input_data): 

    messagestring = '' 

    if isinstance(input_data, list): 
     messagestring = '\n'.join(input_data) 

    elif isinstance(input_data, dict): 
     for key, val in input_data.items(): 
      messagestring += key + '\n' 
      if isinstance(val, dict): 
       for newkey, newval in val.items(): 
        messagestring += newkey + ' ' + newval + '\n' 
      else: 
       messagestring += val + '\n' 
    return messagestring 

Позже, я называю это следующим образом:

weather_msg = location + '\n' + make_message(message) 

Я понял, что кодировка моего файла конфигурации (где «место» приходит from) заставляет всю строку превращаться в ascii, но это всего лишь предположение, и в моем googling я не могу понять, так ли это должно работать.

Я пробовал кучу вещей, в том числе пытаясь кодировать location, и я много кодировал кодировку для Google, но я не могу вернуть своих символов в Юникоде, и я не могу понять, где я жую их.

Может ли кто-нибудь увидеть явную ошибку, которую я делаю где-то, что заставляет мои данные юникода в ascii? В качестве альтернативы, я мог бы написать все это в файл, а затем отправить по электронной почте, если это более разумный способ сделать это, и если это решит мои проблемы с кодировкой. Информация была достаточно короткой, что я просто ее хранил в памяти, но я открыт для того, чтобы сказать, что это глупый способ сделать что-то.

Спасибо за чтение и за любые предложения.

+0

Вы не показали нам код открывающий чем, читает и записывает файл конфигурации , где и звучит, как проблема. – abarnert

+0

Кроме того, при выходе из этой функции 'messagestring' должен быть' str' (что означает Unicode). Что вы видите, что заставляет вас думать, что это не так? – abarnert

+0

Я написал файл конфигурации. Я еще не закодировал часть, которая ее создает. Кроме того, то, что вы упомянули о messagestring, я думал, должно быть верно, но я получаю текст, похожий на этот «Air Temp 66.4» (прямоугольник вопросительный знак) (прямоугольник вопросительный знак) ' – erewok

ответ

3

Python только уважает комментарии к кодировке в исходных файлах, а не текстовые файлы, открытые как данные.

Где бы вы открыть конфигурационный файл, вместо этого:

open(config_path) 

... это сделать:

open(config_path, encoding='utf-8') 
+0

Это был момент лба для меня, потому что я полностью забыл об этом. Я использовал ConfigParser для анализа файла конфигурации и никогда официально не открывал его. Однако, когда я начал работать в Googling, выяснилось, что у других были проблемы с чтением ConfigParser utf-8 (на самом деле найдено несколько потоков в Stack Overflow). Оказывается, проблема связана с приемником. Все остальные тестовые адреса, по которым данные отправляются по электронной почте, кодируют его просто отлично. Вот почему я не мог получить какое-либо другое поведение, даже несмотря на то, что я попробовал множество разных «исправлений» на моей стороне. – erewok

+0

В этом случае это ['ConfigParser.read'] (http://docs.python.org/3.3/library/configparser.html#configparser.ConfigParser.read), в котором вы хотите передать конкретную кодировку, а не 'open' ... но в остальном, такая же сделка. (Если вы не используете Python 3.0-3.1 и не можете обновить, в этом случае вам нужно вручную открыть файл и передать его в 'readfp'.) – abarnert

Смежные вопросы