Python конвертирует эту строку utf8 в латиницу - PullRequest
0 голосов
/ 05 июля 2018

У меня есть эта строка UTF-8:

s = "Naděždaüäö"

Который я хотел бы преобразовать в строку UTF-8, которая может быть encoded в "latin-1" без исключения. Я хотел бы сделать это, заменив каждый символ, который не может быть найден в латинице-1, его ближайшим представлением, скажем, в ascii или около того.

Поскольку "ěž" не в латинице-1, я бы хотел, чтобы они были преобразованы в "ez", а "üäö" в латыни-1, поэтому они не должны быть преобразованы в "uao", а остаются как "UAO".

Моя первая попытка выглядела так:

import unicodedata

def convert(s):
    return unicodedata.normalize(
        'NFKD', s
    ).encode(
        'latin-1', 'ignore'
    ).decode('latin-1')

И это, по крайней мере, дошло до меня:

s = "Naděžda"
print(convert(s))  # --> "Nadezda"

Но потом я понял, что это также преобразует "а", как можно увидеть здесь:

s = "Naděždaäöü"
print(convert(s))  # --> "Nadezdaaou"

В качестве альтернативы я попытался:

def convert2(s):
    return unicodedata.normalize(
        'NFKC', s
    ).encode(
        'latin-1', 'ignore'
    ).decode('latin-1')

Что приводит к:

s = "Naděždaäöü"
print(convert(s))  # --> "Naddaäöü"

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 05 июля 2018

если вы просто делаете это символ за символом, он работает (хотя он не супер чистый)

def convert(s):
    r=''
    for c in s:
        try:
            c.encode('latin-1')
        except UnicodeEncodeError:
            c = unicodedata.normalize('NFKD', c).encode('latin-1', 'ignore').decode('latin-1')
        r += c
    return r
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...