如何检索错误的字符集编码字符串?

How to retrieve wrong charset encoded strings?

在我的 PHP 脚本中,我使用以下代码与 MS SQL 数据库服务器建立了连接,

$connectionInfo = array( "Database"=>$database,"UID"=>$uid, "PWD"=>$pwd);
$conn = sqlsrv_connect( $serverName, $connectionInfo);

我错误地忘记了在 $connectionInfo 中指定 "CharacterSet"=>"UTF-8"。由于这个原因,一些西班牙文和其他字符被编码错误。例如,“álgebra”存储为“¡lgebra”。现在我已经在连接到数据库的过程中设置了正确的字符集,新数据已正确存储。 但如何恢复编码错误并已存储的原始字符串?

很可能您没有丢失任何东西。只需将 string/column 转换为二进制,然后使用适当的编码从二进制转换为字符串。

--2019
select cast(0xC3A16C6765627261 as varchar(100));

declare @t table(thechar varchar(100) collate Latin1_General_100_CI_AI_SC_UTF8)
insert into @t (thechar) values (0xC3A16C6765627261);

select *
from @t;

有时我会使用这个小函数从 UTF8 进行转换,这可能会对您有所帮助:

create function FromUtf8(@src varchar(8000)) returns varchar(8000) as
begin
    declare @c char, @i int
    select @i = patIndex('%[ÂÃ][€-¿]%', @src collate Latin1_General_BIN)
    while @i > 0
        select  @c = char(((ascii(substring(@src, @i, 1)) & 31) * 64)
                         + (ascii(substring(@src, @i + 1, 1)) & 63)),
                @src = stuff(@src, @i, 2, @c),
                @i = patIndex('%[ÂÃ][€-¿]%', @src collate Latin1_General_BIN)
    return @src
end