Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 30, 2011 17:39:16

dmc
От:
Зарегистрирован: 2010-01-25
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

PL/Python и юникод

Пожалуйста, помогите разобраться со встроенным в PostgreSQL вариантом питона.


Создаю в СУБД функцию для транслитерации такого вида:

CREATE OR REPLACE FUNCTION translit_py(seq varchar(64), typ integer)
RETURNS varchar(64) AS
$BODY$

ENCODING_MAP = {
u'а':u'a', u'б':u'b', u'в':u'v', u'г':u'g', u'д':u'd', u'е':u'e', u'ё':u'yo', u'ж':u'zh',
u'з':u'z', u'и':u'i', u'й':u'j', u'к':u'k', u'л':u'l', u'м':u'm', u'н':u'n', u'о':u'o',
u'п':u'p', u'р':u'r', u'с':u's', u'т':u't', u'у':u'u', u'ф':u'f', u'х':u'h', u'ц':u'c',
u'ч':u'ch', u'ш':u'sh', u'щ':u'sh', u'ъ':u'', u'ы':u'y', u'ь':u'', u'э':u'e', u'ю':u'yu',
u'я':u'ya',
u'А':u'A', u'Б':'B', u'В':'V', u'Г':'G', u'Д':'D', u'Е':'E', u'Ё':'Yo', u'Ж':'Zh',
u'З':u'Z', u'И':'I', u'Й':'J', u'К':'K', u'Л':'L', u'М':'M', u'Н':'N', u'О':'O',
u'П':u'P', u'Р':'R', u'С':'S', u'Т':'T', u'У':'U', u'Ф':'F', u'Х':'H', u'Ц':'C',
u'Ч':u'Ch', u'Ш':'Sh', u'Щ':'Sh', u'Ъ':'', u'Ы':'Y', u'Ь':'', u'Э':'E', u'Ю':'Yu',
u'Я':u'Ya',
u'Є':u'Ye', u'І':'I', u'Ї':'Yi', u'Ґ':'G', u'є':'ye', u'і':'i', u'ї':'yi', u'ґ':'g',
}
KEYBOARD_MAP = {
u'й':u'q', u'ц':u'w', u'у':u'e', u'к':u'r', u'е':u't', u'н':u'y', u'г':u'u', u'ш':u'i', u'щ':u'o', u'з':u'p', u'х':u'[', u'ъ':u']',
u'ф':u'a', u'ы':u's', u'в':u'd', u'а':u'f', u'п':u'g', u'р':u'h', u'о':u'j', u'л':u'k', u'д':u'l', u'ж':u'', u'э':u"'",
u'я':u'z', u'ч':u'x', u'с':u'c', u'м':u'v', u'и':u'b', u'т':u'n', u'ь':u'm', u'б':u',', u'ю':u'.',
u'Й':u'Q', u'Ц':u'W', u'У':u'E', u'К':u'R', u'Е':u'T', u'Н':u'Y', u'Г':u'U', u'Ш':u'I', u'Щ':u'O', u'З':u'P', u'Х':u'[', u'Ъ':u']',
u'Ф':u'A', u'Ы':u'S', u'В':u'D', u'А':u'F', u'П':u'G', u'Р':u'H', u'О':u'J', u'Л':u'K', u'Д':u'L', u'Ж':u'', u'Э':u"'",
u'Я':u'Z', u'Ч':u'X', u'С':u'C', u'М':u'V', u'И':u'B', u'Т':u'N', u'Ь':u'M', u'Б':u',', u'Ю':u'.',
u'Є':u'"', u'І':u'S', u'Ї':u'}', u'Ґ':u'|', u'є':u"'", u'і':u's', u'ї':u']', u'ґ':u'\\',
}
result=''
for k in seq:
if typ == 1:
result += ENCODING_MAP.get(k, k)
elif typ == 2:
result += KEYBOARD_MAP.get(k, k)

return result
$BODY$
LANGUAGE plpythonu VOLATILE STRICT
COST 100;
ALTER FUNCTION translit_py(character varying, integer) OWNER TO postgres;
пытаюсь выполнить запрос:

SELECT translit_py('проверка', 1)
в результате выдает исходный текст без транслитерации. эта же функция на чистом Пиотоне 2.6 работает как надо.
Сервер PostgreSQL 9.0 (Ubuntu), кодировка базы - юникод.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version