如何检索错误的字符集编码字符串?
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
在我的 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