Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 UCS-2 --> UTF-8 !!  [new]
retty+++
Member [заблокирован]

Откуда:
Сообщений: 155
В аттаче таблица для bulk insert-а. Получена этим питон-скриптом:

f = open('d:/ucs2utf8.txt', 'wt')

for i in range(128):
    print >> f,str(i)+','+str(hex(i))[2:]

for i in range(128,65536):
    z = unichr(i).encode('utf-8')
    print >> f,str(i)+','+str(hex(ord(z[0])))[2:]+str(hex(ord(z[1])))[2:]

f.close()

create table ucs2utf8
(
ucs2 int primary key clustered,
utf8 varbinary(2)
)

BULK INSERT ucs2utf8 FROM 'D:\ucs2utf8.txt' WITH 
(FIELDTERMINATOR = ',', ROWTERMINATOR = '\n')

Проверяем:
declare
@s nvarchar(80),
@ss varbinary(80),
@i int 

set @s = N'яфя Åk Paço'
set @ss = 0x0
set @i = 1

while @i <= len(@s)
begin
set @ss = @ss + (select utf8 from ucs2utf8 where ucs2 = unicode(substring(@s, @i, 1)))
set @i = @i + 1
end

print cast(@s as varbinary)
print @ss


  0x4F0444044F042000C5006B00200050006100E7006F00
  0x00D18FD184D18F20C3856B205061C3A76F
EFBBBFD18FD184D18F20C3856B205061C3A76F -- эта строка взята из файла в UTF-8, из hex редактора

Три первых байта, EFBBBF, типа служебные, указявки для текст. редакторов;
следующие два байта - D18F - это буква "я" в UTF-8. Полное соответствие.

Есть мнения?

PS Скулевский юникод - это UCS-2 little endian (на моей машине, по крайней мере)

К сообщению приложен файл (ucs2utf8.rar - 5Kb) cкачать
11 авг 08, 21:55    [6054336]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
retty+++
Member [заблокирован]

Откуда:
Сообщений: 155
Пример пострашнее.
И опять полное совпадение с байт-строкой из контрольного UTF-8 файла.
Только нехорошо инициализировать set @utf = 0x0. Этот 0 не должен там болтаться.

declare
@ucs nvarchar(800),
@utf varbinary(800),
@i int 

set @ucs = N'яфя Åk Paço عوديهالشرموطةناناالشرموطةفاطمةالشرموطةليلىالسحاقيةهالة'
set @utf = 0x0
set @i = 1

while @i <= len(@ucs)
begin
set @utf = @utf + (select utf8 from ucs2utf8 where ucs2 = unicode(substring(@ucs, @i, 1)))
set @i = @i + 1
end

print cast(@ucs as varbinary(800))
print @utf


--0x4F0444044F042000C5006B00200050006100E7006F002000390648062F064A06470627064406340631064506480637062906460627064606270627064406340631064506480637062906410627063706450629062706440634063106450648063706290644064A06440649062706440633062D06270642064A0629064706270644062906
--0x00D18FD184D18F20C3856B205061C3A76F20D8B9D988D8AFD98AD987D8A7D984D8B4D8B1D985D988D8B7D8A9D986D8A7D986D8A7D8A7D984D8B4D8B1D985D988D8B7D8A9D981D8A7D8B7D985D8A9D8A7D984D8B4D8B1D985D988D8B7D8A9D984D98AD984D989D8A7D984D8B3D8ADD8A7D982D98AD8A9D987D8A7D984D8A9
EFBBBFD18FD184D18F20C3856B205061C3A76F20D8B9D988D8AFD98AD987D8A7D984D8B4D8B1D985D988D8B7D8A9D986D8A7D986D8A7D8A7D984D8B4D8B1D985D988D8B7D8A9D981D8A7D8B7D985D8A9D8A7D984D8B4D8B1D985D988D8B7D8A9D984D98AD984D989D8A7D984D8B3D8ADD8A7D982D98AD8A9D987D8A7D984D8A9
11 авг 08, 23:41    [6054471]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
retty+++
Member [заблокирован]

Откуда:
Сообщений: 155
Оё... Оказывается можно просто писать set @utf = 0x

И неправильный ведущий 0 уходит.

------0x4F0444044F042000C5006B00200050006100E7006F002000390648062F064A06470627064406340631064506480637062906460627064606270627064406340631064506480637062906410627063706450629062706440634063106450648063706290644064A06440649062706440633062D06270642064A0629064706270644062906
------0xD18FD184D18F20C3856B205061C3A76F20D8B9D988D8AFD98AD987D8A7D984D8B4D8B1D985D988D8B7D8A9D986D8A7D986D8A7D8A7D984D8B4D8B1D985D988D8B7D8A9D981D8A7D8B7D985D8A9D8A7D984D8B4D8B1D985D988D8B7D8A9D984D98AD984D989D8A7D984D8B3D8ADD8A7D982D98AD8A9D987D8A7D984D8A9
--EFBBBFD18FD184D18F20C3856B205061C3A76F20D8B9D988D8AFD98AD987D8A7D984D8B4D8B1D985D988D8B7D8A9D986D8A7D986D8A7D8A7D984D8B4D8B1D985D988D8B7D8A9D981D8A7D8B7D985D8A9D8A7D984D8B4D8B1D985D988D8B7D8A9D984D98AD984D989D8A7D984D8B3D8ADD8A7D982D98AD8A9D987D8A7D984D8A9
12 авг 08, 00:25    [6054533]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
retty+++
Member [заблокирован]

Откуда:
Сообщений: 155
Ой как протупил... Зачем вообще вся эта возня с varbinary???
UTF вполне можно хранить как обыкновенную ANSI varchar() строку символов!
И на клиенте будет проще + как интерпретировать эту строку - это дело клиента.
Доказательство:

declare
@ucs nvarchar(4000),
@utf varchar(8000),
@w varbinary(2),
@i int

set @ucs = N'яфя Åk Paço عوديهالشرموطةناناالشرموطةفاطمةالشرموطةليلىالسحاقيةهالة'
set @utf = ''
set @i = 1

while @i <= len(@ucs)
begin
set @w = (select utf8 from ucs2utf8 where ucs2 = unicode(substring(@ucs, @i, 1)))
if @w/256 != 0 set @utf = @utf + char(@w/256)
if @w-(@w/256)*256 != 0 set @utf = @utf + char(@w-(@w/256)*256)
set @i = @i + 1
end

print @utf

--яфя Åk Paço عوديهالشرموطةناناالشرموطةفاطمةالشرموطةليلىالسحاقيةهالة


Сделайте такой *.html файл, но в ANSI! режиме:


<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
</head>
<body>

яфя Åk Paço عوديهالشرموطةناناالشرموطةفاطمةالشرموطةليلىالسحاقيةهالة

</body>
</html>


В браузере вы увидите то что надо, в UTF-8.
12 авг 08, 04:12    [6054707]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
retty+++
Member [заблокирован]

Откуда:
Сообщений: 155
Окончательный вореанд. Просто замечательно.

В аттаче новая таблица соответствия: юни_код, старший utf-байт, младший utf-байт.
Всё в десятичном формате. Для желающих самостоятельно получить эту таблицу питон-скрипт:

f = open('d:/uni2utf.txt', 'wt')

for i in range(128):
    print >> f, str(i) + ',0,' + str(i)

for i in range(128, 65536):
    z = unichr(i).encode('utf-8')
    print >> f, str(i) + ',' + str(ord(z[0])) + ',' + str(ord(z[1]))

f.close()

Подготовка и демонстрация:

/*
create table uni2utf
(
uni_code int primary key clustered,
utf1 int,
utf2 int
)

BULK INSERT uni2utf FROM 'D:\uni2utf.txt' WITH 
(FIELDTERMINATOR = ',', ROWTERMINATOR = '\n')
*/


declare
@ucs nvarchar(4000),
@utf varchar(8000),  --<<-- UTF строку храним как простой varchar() !!
@bt1 int,
@bt2 int,
@i int

set @ucs = N'Бяф_жук Åk Paço عوديه фокус = Inêsaße 5ª Ave.'
set @utf = ''
set @i = 1

while @i <= len(@ucs)
begin
select @bt1 = utf1, @bt2 = utf2 from uni2utf where uni_code = unicode(substring(@ucs, @i, 1))
if @bt1 != 0 set @utf = @utf + char(@bt1)
set @utf = @utf + char(@bt2)
set @i = @i + 1
end

print len(@ucs) * 2
print len(@utf)
print @utf

--90
--66
--Бяф_жук Åk Paço عوديه фокус = Inêsaße 5ª Ave.

--66 байтов UTF строки:
--D091D18FD1845FD0B6D183D0BA20C3856B205061C3A76F20D8B9D988D8AFD98AD98720D184D0BED0BAD183D181203D20496EC3AA7361C39F652035C2AA204176652E

--Если в начало этой строки добавить три служебных байта (т.н. BOM) 0xEFBBBF,
--то редакторы автоматом будут показывать эту строку как UTF-8, но и без БОМ-а
--они вполне ловко распознают кодировку


К сообщению приложен файл (uni2utf.rar - 43Kb) cкачать
12 авг 08, 15:19    [6057333]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
retty+++
Member [заблокирован]

Откуда:
Сообщений: 155
90 байтов Юникода превратились в 66 UTF-8-байтов. Солидный выигрыш.

Для незнакомых с темой:
собственно, UTF для этого и был придуман: для сокращения траффика при пересылке юникод-текстов.

Хорошая статья: http://docs.python.org/dev/howto/unicode.html#unicode-howto


Unicode started out using 16-bit characters instead of 8-bit characters. 16 bits means you have 2^16 = 65,536 distinct values available, making it possible to represent many different characters from many different alphabets; an initial goal was to have Unicode contain the alphabets for every single human language. It turns out that even 16 bits isn’t enough to meet that goal, and the modern Unicode specification uses a wider range of codes, 0-1,114,111 (0x10ffff in base-16).

... ...

... ...

UTF-8 is one of the most commonly used encodings. UTF stands for “Unicode Transformation Format”, and the ‘8’ means that 8-bit numbers are used in the encoding. (There’s also a UTF-16 encoding, but it’s less frequently used than UTF-8.) UTF-8 uses the following rules:

If the code point is <128, it’s represented by the corresponding byte value.
If the code point is between 128 and 0x7ff, it’s turned into two byte values between 128 and 255.
Code points >0x7ff are turned into three- or four-byte sequences, where each byte of the sequence is between 128 and 255.

UTF-8 has several convenient properties:

1.
It can handle any Unicode code point.

2.
A Unicode string is turned into a string of bytes containing no embedded zero bytes. This avoids byte-ordering issues, and means UTF-8 strings can be processed by C functions such as strcpy() and sent through protocols that can’t handle zero bytes.

3.
A string of ASCII text is also valid UTF-8 text.

4.
UTF-8 is fairly compact; the majority of code points are turned into two bytes, and values less than 128 occupy only a single byte.

5.
If bytes are corrupted or lost, it’s possible to determine the start of the next UTF-8-encoded code point and resynchronize. It’s also unlikely that random 8-bit data will look like valid UTF-8.
12 авг 08, 15:52    [6057555]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Да это все мило. За одним "но" - пропадают все преимущества сервера баз данных при обработке таким образом переконвертированных данных. Вы не сможете поиск сделать нормальный, не сможете индексы использовать, не сможете тот же полнотекстовый поиск сделать.

А без всего этого сервер баз данных превращается в тупое медленное хранилище данных. Сейчас индустрия программного обеспечения такова, что скорость работы волнует всех намного больше, чем объем данных, потому что физические хранилища данных дешевеют, сейчас терабайтной базой никого не напугаешь. А вот скорость работы системы была и есть характеристикой критической.

Поэтому, если вам так важен объем данных, вы можете хоть зиповать их, на здоровье, выигрыш получите еще больший. Но потери скорости в работе (особенно при поиске) из-за вышеприведенных причин будут ненормальными.

Сама тема мне интересна.
UTF-8 поддерживать в обозримом будущем собираются?
Но она мне интересна на уровне встроенного типа, а не конвертации с клиента.
12 авг 08, 16:53    [6057979]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
retty+++
Member [заблокирован]

Откуда:
Сообщений: 155
Я всё понимаю и на это, конечно, не замахивался. Тут хотя бы просто разобраться что к чему.

Хотя для мелкотравчатых БД и моя конвертация на сервере может пригодиться.

============
Сцылку уже читал, не сегодня.
12 авг 08, 17:35    [6058265]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
retty+++
Member [заблокирован]

Откуда:
Сообщений: 155
> Поэтому, если вам так важен объем данных, вы можете хоть зиповать их

Не, тут дело не в гигах, а в том что это реальная проблема: работать со скулевским юникодом,
на клиенте; там такая чехарда начинается что мама не горюй, и каждый api слой считает нужным
подпортить кодировки.
12 авг 08, 17:41    [6058294]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
retty+++
Member [заблокирован]

Откуда:
Сообщений: 155
Вот показательная картинка.
В o.vbs ado читает nvarchar() столбец из скуль таблицы.
На картинке:

первые 3 строки в cp866;
следующие 5 строк в cp1251;
остальные -- в cp1252;

Это проделки cscript.exe, не мои.

К сообщению приложен файл. Размер - 0Kb
12 авг 08, 17:58    [6058396]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
retty+++
Member [заблокирован]

Откуда:
Сообщений: 155
Ну и в виде функции, nvarchar() --> UTF-8 (varchar()). Пусть будет.

create function fn_uni2utf (@ucs nvarchar(4000))
returns varchar(4000)
as
begin

declare
@utf varchar(4000),
@bt1 int,
@bt2 int,
@i int

select @utf = '', @i = 1

while @i <= len(@ucs)
begin
select @bt1 = utf1, @bt2 = utf2 from uni2utf where uni_code = unicode(substring(@ucs, @i, 1))
if @bt1 != 0 set @utf = @utf + char(@bt1)
set @utf = @utf + char(@bt2)
set @i = @i + 1
end

return @utf
end 

GO

print dbo.fn_uni2utf(N'апельсин')

--апельсин

В действии:

К сообщению приложен файл. Размер - 0Kb
13 авг 08, 09:36    [6059720]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
retty+++
Member [заблокирован]

Откуда:
Сообщений: 155
GreenSunrise
Сама тема мне интересна.
UTF-8 поддерживать в обозримом будущем собираются?
Но она мне интересна на уровне встроенного типа, а не конвертации с клиента.


Так. Я что-то начинаю запутываться как та сороконожка.
Я ведь "с блеском" доказал, что UTF-8 можно и нужно хранить как простой varchar()/text().
Поэтому слова "нужна поддержка UTF" -- это как бы нонсенс. Всё уже поддерживается.
13 авг 08, 09:38    [6059728]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Это чтоб не плодить излишеств, т.е. без таблицы. ;)
CREATE FUNCTION [dbo].[fnUTF8] (
	@String	NVarChar(max)
) RETURNS VarChar(max) AS BEGIN
	DECLARE	 @Result	VarChar(max)
		,@Counter	Int
		,@Len		Int
	SELECT	 @Result	= ''
		,@Counter	= 1
		,@Len		= Len(@String)
	WHILE (@@RowCount > 0)
		SELECT	 @Result	= @Result
					+ CASE	WHEN Code < 128		THEN ''
						WHEN Code < 2048	THEN Char(192 + Code / 64)
									ELSE Char(224 + Code / 4096)
						END
					+ CASE	WHEN Code < 128		THEN Char(Code)
						WHEN Code < 2048	THEN Char(128 + Code % 64)
									ELSE Char(128 + Code / 64 % 64)
						END
			,@Counter	= @Counter + 1
		FROM	(SELECT UniCode(SubString(@String,@Counter,1)) AS Code) C
		WHERE	@Counter <= @Len
	RETURN	@Result
END
GO
13 авг 08, 15:30    [6062607]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Mnior
Это чтоб не плодить излишеств, т.е. без таблицы. ;)
CREATE FUNCTION [dbo].[fnUTF8] (
	@String	NVarChar(max)
) RETURNS VarChar(max) WITH RETURNS NULL ON NULL INPUT AS BEGIN
	DECLARE	 @Result	VarChar(max)
		,@Counter	Int
		,@Len		Int
	SELECT	 @Result	= ''
		,@Counter	= 1
		,@Len		= Len(@String)
	WHILE (@@RowCount > 0)
		SELECT	 @Result	= @Result
					+ CASE	WHEN Code < 128		THEN ''
						WHEN Code < 2048	THEN Char(192 + Code / 64)
									ELSE Char(224 + Code / 4096)
						END
					+ CASE	WHEN Code < 128		THEN Char(Code)
						WHEN Code < 2048	THEN Char(128 + Code % 64)
									ELSE Char(128 + Code / 64 % 64)
						END
			,@Counter	= @Counter + 1
		FROM	(SELECT UniCode(SubString(@String,@Counter,1)) AS Code) C
		WHERE	@Counter <= @Len
	RETURN	@Result
END
GO
13 авг 08, 15:50    [6062816]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
retty+++
Member [заблокирован]

Откуда:
Сообщений: 155
Какчественно!
13 авг 08, 16:25    [6063097]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
retty+++
Так. Я что-то начинаю запутываться как та сороконожка.
Я ведь "с блеском" доказал, что UTF-8 можно и нужно хранить как простой varchar()/text().
Поэтому слова "нужна поддержка UTF" -- это как бы нонсенс. Всё уже поддерживается.

"Поддержка" - для меня означает, что это встроенный тип, т.е. который позволит использовать индексы и прочее (см. выше). Ваш способ не позволяет.

Я вообще все данные могу хранить как байнари, любой тип. Это не означает возможности эффективного их использования.
13 авг 08, 16:39    [6063209]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
retty+++
Member [заблокирован]

Откуда:
Сообщений: 155
Как подправить для скуля 2000? Первый вариант у меня не работает:

declare @s nvarchar(4000)

set @s = N'Бяф_жук Åk Paço عوديه фокус = Inêsaße 5ª Ave.'

print dbo.fn_uni2utf(@s)
print '----------------------------------------------------'
print dbo.fnUTF8(@s)



Бяф_жук Åk Paço عوديه фокус = Inêsaße 5ª Ave.
----------------------------------------------------
13 авг 08, 16:56    [6063376]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
retty+++
Member [заблокирован]

Откуда:
Сообщений: 155
GreenSunrise
retty+++
Так. Я что-то начинаю запутываться как та сороконожка.
Я ведь "с блеском" доказал, что UTF-8 можно и нужно хранить как простой varchar()/text().
Поэтому слова "нужна поддержка UTF" -- это как бы нонсенс. Всё уже поддерживается.

"Поддержка" - для меня означает, что это встроенный тип, т.е. который позволит использовать индексы и прочее (см. выше). Ваш способ не позволяет.

Я вообще все данные могу хранить как байнари, любой тип. Это не означает возможности эффективного их использования.

тут есть элемент прикола, не спорю, НО ведь varchar/text поля могут быть проиндексированы?
могут! Нет у скуля физ. возможности (и цели) отличать "осмысленный" varchar текст от UTF-шной абракадабры.
Соль именно в этом. Может, эта абракадабра -- это мой личный эсперанто.
13 авг 08, 17:00    [6063408]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
retty+++
Member [заблокирован]

Откуда:
Сообщений: 155
retty+++

Сделайте такой *.html файл, но в ANSI! режиме:


<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
</head>
<body>

яфя Åk Paço عوديهالشرموطةناناالشرموطةفاطمةالشرموطةليلىالسحاقيةهالة

</body>
</html>


В браузере вы увидите то что надо, в UTF-8.

Протупил. Достаточно выбрать в вашем браузере UTF-8 кодировку для этой страницы и всё станет видно и так.
13 авг 08, 17:04    [6063434]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
retty+++
Member [заблокирован]

Откуда:
Сообщений: 155
Mnior, похоже, у тебя алгоритм какой-то доморощенный$, в смысле, отсебятина.
13 авг 08, 17:35    [6063660]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
retty+++
Mnior, похоже, у тебя алгоритм какой-то доморощенный$, в смысле, отсебятина.
Именно.
Просто взял прикрёплённый файл uni2utf.txt из примера и бегло просмотрел (уже загруженный в таблице), отсебятил формулу и сравнил - получилось 1 к одному :). Потом тупо вписал и сравнил "на глазок" - свиду сошлось.

А вааще хотел порыть в сторону "теории" уникода и UTF-8, но времени небыло. Пока "доморощил" формулу - она показалось просто бредом, как и данные в файле :(.

retty+++
Первый вариант у меня не работает:
Странно, завтра посмотрю, мож плохо скопи-пастил.
retty+++
Как подправить для скуля 2000?
Вроде всё банально, на вскидку чёта не приходит где может быть косяк. Завтра подыму это старьё :) и проведу следственный эксперимент прям на месте преступления.
13 авг 08, 23:38    [6064558]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
retty+++
Member [заблокирован]

Откуда:
Сообщений: 155
вот-вот, посмотри и поправь; я немного отвык от скуля и что-то у меня не догоняется,

выдает пустую строку, а на вид всё как бы Ок!
13 авг 08, 23:52    [6064581]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Потратив 1 пикосекунду на поиск UTF-8, можно сказать, что алхоридм частично верен. Реально используется от 1 до 4 байт. Немного пошаманив над таблицей:
РазмерДиапазон1 байт2 байт3 байт4 байт
1< 128 Code
2< 4096192 + Code / 64128 + Code mod 64
3< 65536224 + Code / 64 / 64128 + Code / 64 mode 64128 + Code mod 64
4< 2097152240 + Code / 64 / 64 / 64128 + Code / 64 / 64 mode 64128 + Code / 64 mode 64128 + Code mod 64

Так что, одним кейсом неглядя - аш писать лень. :)
14 авг 08, 00:36    [6064650]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Закрытыми:
CREATE FUNCTION [dbo].[fnUTF8] (
	@String	NVarChar(max)
) RETURNS VarChar(max) WITH RETURNS NULL ON NULL INPUT AS BEGIN
	DECLARE	 @Result	VarChar(max)
		,@Counter	Int
		,@Len		Int
	SELECT	 @Result	= ''
		,@Counter	= 1
		,@Len		= Len(@String)
	WHILE (@Counter <= @Len)
		SELECT	 @Result	= @Result
					+ CASE	WHEN Code < 128		THEN Char(Code)
						WHEN Code < 4096	THEN Char(192 + Code / 64) + Char(128 + Code % 64)
						WHEN Code < 65536	THEN Char(224 + Code / 64 / 64) +  Char(128 + Code / 64 % 64) + Char(128 + Code % 64)
									ELSE Char(240 + Code / 64 / 64 / 64) +  Char(128 + Code / 64 / 64 % 64) + Char(128 + Code / 64 % 64) + Char(128 + Code % 64)
						END
			,@Counter	= @Counter + 1
		FROM	(SELECT UniCode(SubString(@String,@Counter,1)) AS Code) C
	RETURN	@Result
END
GO
Только проверьте, правильно ли я списываю с официального сайта и потом в код. А то с этим бывают у меня проблемы. :(
14 авг 08, 00:45    [6064665]     Ответить | Цитировать Сообщить модератору
 Re: UCS-2 --> UTF-8 !!  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Mnior
Только проверьте, правильно ли я списываю с официального сайта и потом в код. А то с этим бывают у меня проблемы. :(
Вот пжалуста:
РазмерДиапазон1 байт2 байт3 байт4 байт
1< 128 Code
2< 2048192 + Code / 64128 + Code mod 64
3< 65536224 + Code / 64 / 64128 + Code / 64 mode 64128 + Code mod 64
4< 2097152240 + Code / 64 / 64 / 64128 + Code / 64 / 64 mode 64128 + Code / 64 mode 64128 + Code mod 64
CREATE FUNCTION [dbo].[fnUTF8] (
	@String	NVarChar(max)Только проверьте, правильно ли я списываю с официального сайта и потом в код. А то с этим бывают у меня проблемы. :([/quot]
) RETURNS VarChar(max) WITH RETURNS NULL ON NULL INPUT AS BEGIN
	DECLARE	 @Result	VarChar(max)
		,@Counter	Int
		,@Len		Int
	SELECT	 @Result	= ''
		,@Counter	= 1
		,@Len		= Len(@String)
	WHILE (@Counter <= @Len)
		SELECT	 @Result	= @Result
					+ CASE	WHEN Code < 128		THEN Char(Code)
						WHEN Code < 2048	THEN Char(192 + Code / 64) + Char(128 + Code % 64)
						WHEN Code < 65536	THEN Char(224 + Code / 64 / 64) +  Char(128 + Code / 64 % 64) + Char(128 + Code % 64)
									ELSE Char(240 + Code / 64 / 64 / 64) +  Char(128 + Code / 64 / 64 % 64) + Char(128 + Code / 64 % 64) + Char(128 + Code % 64)
						END
			,@Counter	= @Counter + 1
		FROM	(SELECT UniCode(SubString(@String,@Counter,1)) AS Code) C
	RETURN	@Result
END
GO
14 авг 08, 00:58    [6064675]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить