I'm using both the following methods to encode in base 64 a Chinese string. Problem is that I'm having Pz8=
as output, which decoded is ??
What's wrong with this and how can I fix it?
Method 1
CREATE FUNCTION [dbo].[base64Encode] (@input VARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @output NVARCHAR(MAX),
@bits VARBINARY(3),
@pos INT
SET @pos = 1
SET @output = ''
WHILE @pos <= LEN(@input)
BEGIN
SET @bits = CONVERT(VARBINARY(3), SUBSTRING(@input, @pos, 3))
SET @output = @output + SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', SUBSTRING(@bits, 1, 1) / 4 + 1, 1)
SET @output = @output + SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', SUBSTRING(@bits, 1, 1) % 4 * 16 + SUBSTRING(@bits, 2, 1) / 16 + 1, 1)
SET @output = @output + SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', SUBSTRING(@bits, 2, 1) % 16 * 4 + SUBSTRING(@bits, 3, 1) / 64 + 1, 1)
SET @output = @output + SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', SUBSTRING(@bits, 3, 1) % 64 + 1, 1)
SET @pos = @pos + 3
END
RETURN (LEFT(@output, LEN(@output) - 3 + LEN(@bits)) + REPLICATE('=', 3 - LEN(@bits)))
END
SELECT [dbo].[base64Encode]('你好')
Method 2
SELECT CAST('你好' as varbinary(max)) FOR XML PATH(''), BINARY BASE64