Начало » Использование СУБД » Microsoft SQL Server » Base64 с помощью t-sql 
	
		
		
			| Base64 с помощью t-sql [сообщение #126] | 
			Thu, 30 June 2022 14:36   | 
		 
		
			
				
				
				
					
						  
						BlackEric
						 Сообщений: 393 Зарегистрирован: 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)') 
) 
 
		
		
		
 |  
	| 
		
	 | 
 
 
 |   
Переход к форуму:
 
 Текущее время: Tue Nov 04 03:25:03 GMT+3 2025 
 Общее время, затраченное на создание страницы: 0.00812 секунд 
 |