Начало » Использование СУБД » Microsoft SQL Server » Base64 с помощью t-sql
Base64 с помощью t-sql [сообщение #126] |
Thu, 30 June 2022 14:36 |
BlackEric
Сообщений: 368 Зарегистрирован: June 2022
|
Senior Member |
|
|
--UTF-16LE согласно https://www.base64decode.org/
SELECT CAST(N'Вася пошел гулять 123 qaz' as varbinary(max)) FOR XML PATH(''), BINARY base64
SELECT CAST( CAST( 'EgQwBEEETwQgAD8EPgRIBDUEOwQgADMEQwQ7BE8EQgRMBCAAMQAyADMAIABxAGEAegA=' as XML ).value('.','varbinary(max)') AS nvarchar(max) )
--UTF-8 Русский не держит
SELECT CAST( CAST( 'MTIzNDU2Nzg5MCBWYXNqYSBwb3NoZWwgZ3VsYXQ=' as XML ).value('.','varbinary(max)') AS varchar(max) )
Какие ещё есть варианты?
|
|
|
Re: Base64 с помощью t-sql [сообщение #249 является ответом на сообщение #126] |
Sun, 31 July 2022 10:15 |
aleks2
Сообщений: 1 Зарегистрирован: July 2022
|
Junior Member |
|
|
Ващето, в новых версиях усе это ё.
Но до 2012 (включительно) можно так
-- Description: Преобразование строки nvarchar (utf16) в utf8
-- =============================================
--v2
ALTER FUNCTION [dbo].[utf16-to-utf8-v2]( @utf16 nvarchar(max) )
RETURNS TABLE
AS
RETURN
(
with t as ( select n, c = unicode( substring(@utf16, n, 1) ) from dbo.N where n between 1 and len(@utf16) )
, b as ( select n
, b = case when c < 0x80 then cast(c as varbinary(1))
when c < 0x800 then cast(((c * 4) & 0xFF00) | (c & 0x3F) | 0xC080 as varbinary(2))
when c < 0x10000 then cast(((c * 0x10) & 0xFF0000) | ((c * 4) & 0x3F00) | (c & 0x3F) | 0xe08080 as varbinary(3))
else cast(((c * 0x40) & 0xFF000000) | ((c * 0x10) & 0x3F0000) | ((c * 4) & 0x3F00) | (c & 0x3F) | 0xf0808080 as varbinary(4))
end
from t
)
select utf8 = convert(varbinary(max), ( select convert(varchar(, b, 2) from b order by n asc for xml path('') ), 2)
)
-- Description: Преобразование utf8 в utf16 (nchar)
-- =============================================
/*
declare @b as varbinary(max) = 0xD09CD0BED180D0B520D0A2D180D18DD0B2D0B5D0BB2E20D094D09ED09A D0A3D09CD095D09DD0A2D0AB20D094D09BD0AF20D09AD09BD098D095D09D D0A2D09020D0BFD0BE20D182D183D180D1832054523830393230303034;
select [nchar] = cast( @b as nvarchar(max)), * from dbo.[utf8-to-utf16](@b)
*/
ALTER FUNCTION [dbo].[utf8-to-utf16]( @utf8 varbinary(max) )
RETURNS TABLE
AS
RETURN
(
with b as ( select b = substring(@utf8, n, 1), n from dbo.N where n between 1 and len(@utf8) )
, bn as ( select b, n from b where b&128 = 0 or b&224 = 192 or b&240 = 224 or b&248 = 240 )
, chs as ( select b = case
when b&128 = 0 then b
when b&224 = 192 then (b&31) * 64 | ( substring(@utf8, n+1, 1) & 63 )
when b&240 = 224 then ( (b&15) * 64 | ( substring(@utf8, n+1, 1) & 63 ) ) * 64 | ( substring(@utf8, n+2, 1) & 63 )
else ( ( (b&07) * 64 | ( substring(@utf8, n+1, 1) & 63 ) ) * 64 | ( substring(@utf8, n+2, 1) & 63 ) ) * 64 | ( substring(@utf8, n+3, 1) & 63 )
end
, n
from bn
)
select utf16 = ( select nchar(b) from chs order by n asc for xml path(''), type ).value('.', 'nvarchar(max)')
)
|
|
|
Переход к форуму:
Текущее время: Thu Dec 19 02:23:22 GMT+3 2024
Общее время, затраченное на создание страницы: 0.00934 секунд
|