Я пишу цю функцію для перевірки, якщо місяць у перської мови існує в рядку uicode, замінити це з номером місяця. Я використовую це кодування в заголовку
`#!/usr/bin/python
# -*- coding: utf-8 -*-`
це мій def для перетворення місяця
def changeData(date):
if date:
date.encode("utf-8")
if "فروردین".encode("utf-8") in date:
return str.replace(":فروردین", ":1")
elif "اردیبهشت".encode("utf-8") in date:
return str.replace(":اردیبهشت", ":2")
elif "خرداد".encode("utf-8") in date:
return str.replace(":خرداد", ":3")
elif "تیر".encode("utf-8") in date:
return str.replace(":تیر", ":41")
elif "مرداد".encode("utf-8") in date:
return str.replace(":مرداد", ":5")
elif "شهریور".encode("utf-8") in date:
return str.replace(":شهریور", ":6")
elif "مهر".encode("utf-8") in date:
return str.replace(":مهر", ":7")
elif "آبان".encode("utf-8") in date:
return str.replace(":آبان", ":8")
elif "آذر".encode("utf-8") in date:
return str.replace(":آذر", ":9")
elif "دی".encode("utf-8") in date:
return str.replace(":دی", ":10")
elif "بهمن".encode("utf-8") in date:
return str.replace(":بهمن", ":11")
elif "اسفند".encode("utf-8") in date:
return str.replace(":اسفند", ":12")
Я передаю дату з форматом unicode у функції, потім перетворити його в encode("utf-8")
але дайте мені цю помилку
if "فروردین".encode("utf-8") in date:
UnicodeDecodeError: "ascii" codec can"t decode byte 0xd9 in position 0: ordinal not in range(128)
як я можу вирішити цю проблему
Відповіді:
1 для відповіді № 1Я вважаю, що Python 2.7.
Тому:
"فروردین".encode("utf-8") # UnicodeDecodeError: "ascii" codec can"t decode byte 0xd9 in position 0: ordinal not in range(128)
Проблема полягає в тому, що в Python 2.7 рядки - це байти:
print(repr("فروردین")) # "xd9x81xd8xb1xd9x88xd8xb1xd8xafxdbx8cxd9x86"
З наступним кодом:
"فروردین".encode("utf-8")
ви намагаєтеся кодувати байти, що логічно неправильно, тому що:
ENCODING: unicode --> bytes
DECODING: bytes --> unicode
Але Python не кидав нічого схожого TypeError
, тому що Python розумний.
У такому випадку він намагається спочатку декодувати задані байти до unicode, а потім виконати кодування, вказане користувачем.
Проблема полягає в тому, що Python робить описане декодування за кодуванням за замовчуванням ASCII
в Python 2. Тому програма закінчується за допомогою UnicodeDecodeError
.
Описане декодування подібне до:
unicode("فروردین") # UnicodeDecodeError: "ascii" codec can"t decode byte 0xd9 in position 0: ordinal not in range(128)
Отже, ви не повинні кодувати байт-рядок, і ви повинні DECODE це для отримання unicode:
u = "فروردین".decode("utf-8")
print(type(u)) # <type "unicode">
Інший спосіб отримати unicode - використовувати u
-літеральна декларація + кодування:
# coding: utf-8
u = u"فروردین"
print(type(u)) # <type "unicode">
print(u == "فروردین".decode("utf-8")) # True