/ / find arabic word string у рядку дають помилку "ascii" кодек не може декодувати

знайти арабський рядок слів у рядку дати помилку 'ascii' кодек не може декодувати - python, unicode, arabic

Я пишу цю функцію для перевірки, якщо місяць у перської мови існує в рядку 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