Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Транслитерация имен и фамилий  [new]
Exel_Analyst
Member

Откуда:
Сообщений: 14
Добрый день!

Как проще и изящнее сделать транслитерацию имен и фамилий в базе (из латиницы в кириллицу)?
Понятно, что можно таблицу соответствия букв создать. Но может как-то изящнее? может какой-нибудь сторонний сервис есть?
11 ноя 13, 12:30    [15108012]     Ответить | Цитировать Сообщить модератору
 Re: Транслитерация имен и фамилий  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Exel_Analyst
транслитерацию имен и фамилий в базе (из латиницы в кириллицу)?

Именно из латиницы в кириллицу? По ГОСТу, или по какому-то другому критерию?
11 ноя 13, 12:43    [15108120]     Ответить | Цитировать Сообщить модератору
 Re: Транслитерация имен и фамилий  [new]
штук 40 реплейсов?
Guest
только порядок применения продумать, чтоб сперва заменять пары-тройки, только потом единичные буквы.
чтоб не расщеплять "ch", "sh", "sch"
11 ноя 13, 12:45    [15108136]     Ответить | Цитировать Сообщить модератору
 Re: Транслитерация имен и фамилий  [new]
Exel_Analyst
Member

Откуда:
Сообщений: 14
Гость333
Именно из латиницы в кириллицу? По ГОСТу, или по какому-то другому критерию?

Критерий пока не формализован. Наверное, по ГОСТу лучше
11 ноя 13, 12:49    [15108171]     Ответить | Цитировать Сообщить модератору
 Re: Транслитерация имен и фамилий  [new]
ZOOKABAKODER
Member

Откуда:
Сообщений: 178
Я б так делал:
Таблица: dbo.Translit (префикс суффикс, если надо)
Поля:
LangSrcCode char(2) - код языка http://ru.wikipedia.org/wiki/Коды_языков
LangDstCode char(2) - код языка
SrcText nvarchar(256) not null - строчка на LangSrc
SrcTextLen int not null - длина строчки SrcText
DstText nvarchar(256) - строчка на LangDst

Индекс кластерный : {LangSrcCode, LangDstCode, SrcTextLen}

И процедуркой (не проверял, если баги есть сорри):
-- параметры --
DECLARE 
	@iName NVARCHAR(256) = 'Карабаляков'
,	@iLangSrcCode CHAR(2) = 'ru'
,	@iLangDstCode CHAR(2) = 'en'
------------------

DECLARE 
	@NameSrcSuffix AS NVARCHAR(256)
,	@NameDstSuffix AS NVARCHAR(256)
,	@LenTot INT = LEN(@iName)

DECLARE
	@PosFirst INT = 0
,	@Len INT = @LenTot
,	@Pos INT;

DECLARE
	@oName AS NVARCHAR(256);

WHILE @PosFirst < @LenTot
BEGIN
	SET @Len = @LenTot - @PosFirst
	
	WHILE @Len > 0
	BEGIN
		SET @NameDstSuffix = 
		(	SELECT
				@NameDstSuffix = DstText
			FROM
				dbo.Translit
			WHERE
				@iLangSrcCode = LangSrcCode 
			AND	@iLangDstCode = LangDstCode
			AND	@Len = SrcTextLen
			AND	@NameSrcSuffix = SrcText);
	
		IF @NameDstSuffix IS NOT NULL
		BEGIN
			SET @oName = @oName + @NameDstSuffix;
			SET @PosFirst += @Len;
			BREAK;
		END;
	
		SET @Len -= 1;
	END;
	
	IF @Len = 0
		RAISERROR ('Translit error. Text not found. SrcText = "%s"; Lang = {%s, %s}.', 11, 0, @NameSrcSuffix, @iLangSrcCode, @iLangDstCode);
		-- тут return
END;

SELECT @oName;
-- тут return


Выигрыш в том, что можно делать транслиты на каких хош языках. Вместе со всякими буквами и слонами, в табличку можно напихать и непосредственные переводы, например "John" = "Джон". Всё гуглицца.
11 ноя 13, 13:25    [15108505]     Ответить | Цитировать Сообщить модератору
 Re: Транслитерация имен и фамилий  [new]
ZOOKABAKODER
Member

Откуда:
Сообщений: 178
Ну вот и баг, забыл присвоить строчку:

-- параметры --
DECLARE 
	@iName NVARCHAR(256) = 'Карабаляков'
,	@iLangSrcCode CHAR(2) = 'ru'
,	@iLangDstCode CHAR(2) = 'en'
------------------

DECLARE 
	@NameSrcSuffix AS NVARCHAR(256)
,	@NameDstSuffix AS NVARCHAR(256)
,	@LenTot INT = LEN(@iName)

DECLARE
	@PosFirst INT = 0
,	@Len INT = @LenTot;

DECLARE
	@oName AS NVARCHAR(256);

WHILE @PosFirst < @LenTot
BEGIN
	SET @Len = @LenTot - @PosFirst
	
	WHILE @Len > 0
	BEGIN
		SET @NameSrcSuffix = SUBSTRING(@iName, @PosFirst, @Len);
		SET @NameDstSuffix = 
		(	SELECT
				@NameDstSuffix = DstText
			FROM
				dbo.Translit
			WHERE
				@iLangSrcCode = LangSrcCode 
			AND	@iLangDstCode = LangDstCode
			AND	@Len = SrcTextLen
			AND	@NameSrcSuffix = SrcText);
	
		IF @NameDstSuffix IS NOT NULL
		BEGIN
			SET @oName = @oName + @NameDstSuffix;
			SET @PosFirst += @Len;
			BREAK;
		END;
	
		SET @Len -= 1;
	END;
	
	IF @Len = 0
		RAISERROR ('Translit error. Text not found. SrcText = "%s"; Lang = {%s, %s}.', 11, 0, @NameSrcSuffix, @iLangSrcCode, @iLangDstCode);
		-- тут return
END;

SELECT @oName;
-- тут return


Выигрыш в том, что можно делать транслиты на каких хош языках. Вместе со всякими буквами и слонами, в табличку можно напихать и непосредственные переводы, например "John" = "Джон". Всё гуглицца.
11 ноя 13, 13:29    [15108548]     Ответить | Цитировать Сообщить модератору
 Re: Транслитерация имен и фамилий  [new]
штук 40 реплейсов?
Guest
ZOOKABAKODER,

процедуру?
на каждую строку таблицы?
это круто.
кстати, и как на каждую строку таблицы ее вызывать, курсором?
"циклы и курсоры наше все", да?
11 ноя 13, 13:42    [15108644]     Ответить | Цитировать Сообщить модератору
 Re: Транслитерация имен и фамилий  [new]
aleks2
Guest
штук 40 реплейсов?
ZOOKABAKODER,

процедуру?
на каждую строку таблицы?
это круто.
кстати, и как на каждую строку таблицы ее вызывать, курсором?
"циклы и курсоры наше все", да?

1. Никто не мешает сделать скалярную функцию.
2. Только такой "говнокод" не надо туды пихать.
3. Одной таблицы замен и одного селекта вполне достаточно.
11 ноя 13, 13:47    [15108687]     Ответить | Цитировать Сообщить модератору
 Re: Транслитерация имен и фамилий  [new]
штук 40 реплейсов?
Guest
aleks2
...
3. Одной таблицы замен и одного селекта вполне достаточно.


+

Exel_Analyst
Понятно, что можно таблицу соответствия букв создать.


типа аффтор про такое решение в курсе, искал альтернативное, не?
11 ноя 13, 14:00    [15108808]     Ответить | Цитировать Сообщить модератору
 Re: Транслитерация имен и фамилий  [new]
ZOOKABAKODER
Member

Откуда:
Сообщений: 178
aleks2
штук 40 реплейсов?
ZOOKABAKODER,

-3. процедуру?
-2. на каждую строку таблицы?
-1. это круто.
0. кстати, и как на каждую строку таблицы ее вызывать, курсором?
"циклы и курсоры наше все", да?

1. Никто не мешает сделать скалярную функцию.
2. Только такой "говнокод" не надо туды пихать.
3. Одной таблицы замен и одного селекта вполне достаточно.

-3. Чо хочешь то и делай.
-2. на какую каждую строку. На каждый суффикс, если такого нет.
-1. Спасибо.
0. Если у тебя есть таблица имён и надо все перевести в транслит, пиши код как хош. OUTPUT PARAMETER "не не слышал". В последствии я б прописал транслит в момент вписывания имени в БД. Вот ща подорвусь код писать весь! - Мне делать нечего чтоль, бро? Я показал алгоритм, как хотишь так его и привязывай к своей базе.
1. Никто.
2. А реализуй ка своим идеальным кодом, малыш. Я жду!
3. Собсно если есть замены для всех фамилий; да, мой код будет делать один селект на каждую.
11 ноя 13, 14:14    [15108965]     Ответить | Цитировать Сообщить модератору
 Re: Транслитерация имен и фамилий  [new]
aleks2
Guest
Учись,студент.
create table dbo.translit(ru nchar(1) unique, en nvarchar(3) unique, ordnum int identity primary key clustered );
go
insert dbo.translit (ru, en)
values
(N'щ', N'shh')
,(N'ё', N'jo') 
,(N'ж', N'zh') 
,(N'й', N'jj') 
,(N'х', N'kh') 
,(N'ч', N'ch') 
,(N'ш', N'sh') 
,(N'э', N'eh') 
,(N'ю', N'ju') 
,(N'я', N'ja') 
,(N'а', N'a') 
,(N'б', N'b') 
,(N'в', N'v') 
,(N'г', N'g') 
,(N'д', N'd') 
,(N'е', N'e') 
,(N'з', N'z') 
,(N'и', N'i') 
,(N'к', N'k') 
,(N'л', N'l') 
,(N'м', N'm') 
,(N'н', N'n') 
,(N'о', N'o') 
,(N'п', N'p') 
,(N'р', N'r') 
,(N'с', N's') 
,(N'т', N't') 
,(N'у', N'u') 
,(N'ф', N'f')
,(N'ц', N'c') 
,(N'ъ', N'"') 
,(N'ы', N'y') 
,(N'ь', N'''');
go
select * from dbo.translit;
go
create function dbo.En2Ru(@str nvarchar(4000))
returns nvarchar(4000)
as
begin
  select @str = replace(@str, en, ru) from dbo.translit order by ordnum;
  return @str;
end;
go
select dbo.En2Ru(N'jozhjjkhchshehjujaabvgdshh') 
11 ноя 13, 16:21    [15110041]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить